我正在尝试使用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表示r
和s
不在范围内。
答案 0 :(得分:7)
如果你想在警卫中进行模式匹配,你必须使用pattern guard:
g :: Int -> Maybe Int
g x
| Just (r,_) <- u = Just r
| otherwise = Nothing
where
u = f x
毕竟,(==)
是一个常规函数,您需要双方的值才能使用它。由于r
中s
和u == Just (r,s)
未知,因此编译器会向您显示错误消息。
顺便说一下,如果某个函数Maybe
和Nothing
的值为Nothing
或Just (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