Нельзя использовать проверку на равенство (==) :: Eq a => a -> a -> Bool
с такими переменными, как first
и second
, если они не имеют значения. Здесь вам нужно сопоставление с шаблоном .
Мы можем, например, использовать понимание списка:
foo :: Program -> Int
foo list = length [ v | <b>v@(Front _) <-</b> list ]
Нет необходимости сопоставлять параметр с Val {}
, или Val _ _ _
и т. Д., Поскольку единственный конструктор данных для типа Val
- Val
.
Если вы думаете, что позже добавите больше конструкторов данных, вы можете добавить дополнительный подшаблон:
foo :: Program -> Int
foo list = length [ v | v@(Front <b>(Val {})</b>) <- list ]
Или мы можем выполнить сопоставление с образцом в функции и использовать filter :: (a -> Bool) -> [a] -> [a]
, например:
foo :: Program -> Int
foo = length . filter f
where f <b>(Front _)</b> = True
f _ = False
или если мы включим проверку конструктора данных Val
:
foo :: Program -> Int
foo = length . filter f
where f (Front <b>(Val {})</b>) = True
f _ = False