Replies (11)
- @0xd34df00d:@PineappleZombie О, вот ты-то мне и нужен. Как бы ты переписал лямбду в этом filter?
filter (\(GBlockID (_, pid)) -> pid <= piece) (missingBlocks nInfo)
Я пытаюсь скомбинировать snd, частично приложенный (<=) и так далее, но необходимость паттерн-матчить по конструктору GBlockID все ломает. - @0xd34df00d:@Stiletto Да хрен с ним с перегондониванием, его читать труднее )
- @PineappleZombie:@0xd34df00d filter go (missingBlocks ninfo) where go (GBlockID (_,pid)) = pid <= piece
OR
filter ((<= piece) . myPreciousGetter) (missingBlocks ninfo)
Но для второго варианта нужен геттер
А GBlockID действительно надо делать newtype вокруг тупли? - @0xd34df00d:@PineappleZombie Ну он именно что newtype по смыслу, это не просто тупля, а именно конкретный тип же.
- @PineappleZombie:@0xd34df00d Но тогда почему newtype Foo = Foo (A,B) , а не data Foo A B или
Data Foo = Foo { getA :: A , getB :: B } (+ геттеры нахаляву) - @0xd34df00d:@PineappleZombie Хм, а скажи мне тогда best practices по newtype vs data.
- @PineappleZombie:@0xd34df00d newtype нужен когда тип имеет только один конструсктор с одним параметром. Тогда новый тип в рантайм будет иметь то же самое представление, что и старый. Затем и нужны
newtype FD = FD CInt — Будет представлен так же как и CInt
А тупли просто несколько выделены. (a,b) будет иметь такое же представление как и Foo a b. Поэтому newtype вокруг тупли ничего не даёт кроме синтактического мусора. Иногда, конечно, он бывает оправданfrom 046cb161dc561c982af2a68e371312b8, 10 months ago, in reply to /9 - @0xd34df00d:@PineappleZombie Гм, надо срочно переписывать.
type BlockID = Int
type PieceID = Int
newtype GBlockID = GBlockID (BlockID, PieceID)
deriving (Show, Eq, Ord)from idead, 10 months ago, in reply to /10