@(_:_),它在模式匹配中如何工作

时间:2015-07-15 03:58:17

标签: haskell

这是一个从o'赖利 - real world haskell

.tar

maybeReview alist = do title <- lookup1 "title" alist return (MovieReview title)' lookup1 key alist = case lookup key alist of Just (Just s@(_:_)) -> Just s _ -> Nothing 符号如何在这里工作,

@

它如何与非空值匹配?

1 个答案:

答案 0 :(得分:11)

_是一个通配符。它说确保这里有一个值,但我不想将它绑定到任何变量。 :是列表的构造函数。左边是一个值,右边是列表的其余部分。列表的其余部分可以为空。所以如果你做这样的事情:

(x:xs)

x是列表的第一个元素,xs可以是空列表,也可以是无限量的元素。

(x:y:xs)

仅匹配包含至少2个元素的列表。 @是at模式。它将整个右表达式绑定到左变量。

m@(Just _)

此处m的类型为Maybe a。仅使用_,因为Just的类型为a -> Maybe a,我们需要为其参数设置占位符。所以m绑定(Just _)的整个值。在你的例子中。

s@(_:_)

s是整个列表。 (_:_)指定列表必须至少包含一个元素,否则匹配将失败。如果我们写道:

s@(x:xs)

x将是第一个元素,xs将成为列表的尾部。 s == x:xs将返回True。但由于我们不需要头部或尾部,我们只需使用_