我在使用此程序时遇到了问题。
filterJust :: [Maybe a] -> [a]
filterJust [] = []
filterJust x = map fromJust (filter (isJust) x)
但ghci不断报告此
编辑:
我不想使用任何其他模块,所以我做了这个:
filterJust :: [Maybe a] -> [a]
filterJust x = map unpack (filter (Nothing /=) x)
unpack (Just a) = a
我收到此消息
我不明白为什么。我应该能够使用Eq函数而无需导入anthing吗?
答案 0 :(得分:17)
您不需要编写filterJust
功能。它已在base
中,名为catMaybes
:http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Maybe.html#v:catMaybes
此外,您可以看到更好的方法来定义此功能:
catMaybes :: [Maybe a] -> [a]
catMaybes ls = [x | Just x <- ls]
所以你需要做的只是将import Data.Maybe (catMaybes)
添加到你的模块中。
答案 1 :(得分:3)
split
只能用于实现/=
(Eq
)类型的值。(/=) :: (Eq a) -> a -> a -> Bool
仅在Maybe a
支持Eq
时支持a
。instance (Eq a) => Eq (Maybe a)
适用于所有类型filterJust
,即使是那些不实施a
的人:Eq
因此[Maybe a] -> [a]
无法使用filterJust
。