Filtering Nothing and unpack Just

2020-04-04 12:32发布

I'm having trouble with this program.

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

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

but ghci keeps reporting this

but ghci keeps reporting this

EDIT:

I don't want to use any additional module so i made this:

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

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

unpack (Just a) = a

and i get this message

and i get this message

and i dont understand why. I should be able to use Eq functions without importing anthing right?

标签: haskell
2条回答
别忘想泡老子
2楼-- · 2020-04-04 13:07
  • /= can only be used on values of a type that implements Eq ((/=) :: (Eq a) -> a -> a -> Bool).
  • Maybe a supports Eq only if a does (there's an instance (Eq a) => Eq (Maybe a)).
  • Your type signature says that filterJust works for all types a, even those that don't implement Eq: [Maybe a] -> [a]

Therefore filterJust can't use /=.

查看更多
Root(大扎)
3楼-- · 2020-04-04 13:26

You don't need to write filterJust function. It is already in base and it is called catMaybes: http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Maybe.html#v:catMaybes

Also, you can see better way to define this function:

catMaybes :: [Maybe a] -> [a]
catMaybes ls = [x | Just x <- ls]

So all you need to do is just add import Data.Maybe (catMaybes) into your module.

查看更多
登录 后发表回答