过滤任何内容并解压缩

时间:2016-10-30 09:34:55

标签: haskell

我在使用此程序时遇到了问题。

filterJust :: [Maybe a] -> [a]

filterJust [] = []
filterJust x = map fromJust (filter (isJust) x)

但ghci不断报告此

but ghci keeps reporting this

编辑:

我不想使用任何其他模块,所以我做了这个:

filterJust :: [Maybe a] -> [a]

filterJust x = map unpack (filter (Nothing /=) x)

unpack (Just a) = a

我收到此消息

and i get this message

我不明白为什么。我应该能够使用Eq函数而无需导入anthing吗?

2 个答案:

答案 0 :(得分:17)

您不需要编写filterJust功能。它已在base中,名为catMaybeshttp://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