这是一个从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
符号如何在这里工作,
@
它如何与非空值匹配?
答案 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
。但由于我们不需要头部或尾部,我们只需使用_
。