与Just包含一对的模式匹配

时间:2017-02-13 07:36:55

标签: haskell

我正在尝试使用Haskell,我想知道为什么我无法匹配Just包含一对。我对这种语言没什么经验,我完全迷失了。

f :: Int -> Maybe (Int, [Int])
f 100 = Nothing
f x = Just (x,[x])

g :: Int -> Maybe Int
g x
 | u==Nothing = Nothing
 | u==(Just (r,s)) = Just r
 where 
  u=f x

这个代码出了什么问题。 GHC表示rs不在范围内。

3 个答案:

答案 0 :(得分:7)

如果你想在警卫中进行模式匹配,你必须使用pattern guard

g :: Int -> Maybe Int
g x
  | Just (r,_) <- u = Just r
  | otherwise       = Nothing 
  where 
   u = f x

毕竟,(==)是一个常规函数,您需要双方的值才能使用它。由于rsu == Just (r,s)未知,因此编译器会向您显示错误消息。

顺便说一下,如果某个函数MaybeNothing的值为NothingJust (h x),则需要h并返回Just x如此常见,它形成了一种模式:fmap。你可以写

g :: Int -> Maybe Int
g x = fmap fst (f x)

答案 1 :(得分:6)

因为守护表达式不能进行模式匹配。

Guard表达式就像一个布尔表达式,它不能做绑定。它只使用|之前的绑定,在本例中为x

所以工作解决方案就是这样。

g :: Int -> Maybe Int
g x = case f x of
  Nothing -> Nothing
  Just (r,_) -> Just r

答案 2 :(得分:4)

您可以使用case expressions

g :: Int -> Maybe Int
g x =
  case f x of
    Nothing -> Nothing
    Just (r,s) -> Just r