什么做@和!意思?

时间:2015-07-01 14:23:15

标签: haskell pattern-matching symbols

 suffixes :: [a] -> [[a]]
 suffixes xs@(_:xs') = xs : suffixes xs'
 suffixes _          = []

我只知道@这里被称为“AsPattern”。但它在这里如何运作呢? 有人能给我一个分析吗?

怎么样!在哈斯克尔工作。 我现在不能举一个例子。但我很确定它确实发生在haskell编程中。

4 个答案:

答案 0 :(得分:8)

@符号允许您进行模式匹配并引用与模式匹配的整个值。在您的示例中,您可以将整个列表参数称为xs(使用@符号),将列表尾部称为xs'(使用模式匹配)。

!符号可用于强制严格评估值而不是懒惰(使用爆炸模式或严格注释)。

答案 1 :(得分:3)

在Haskell中,您可以使用As Pattern为参数提供一个替代名称,您可以通过该名称引用它。在你的情况下,

{{1}}

允许您使用xs作为参数的替代名称(_:xs')。否则,您将无法执行此操作,因为_匹配任何参数,但否则无法使用。

答案 2 :(得分:3)

@符号用于将xs绑定到您使用的模式(_:xs'),因此xs'绑定到列表的尾部并xs 1}}被绑定到列表尾部的头部。!用于向量的O(1)常量时间索引。请参阅此处的文档:https://hackage.haskell.org/package/vector-0.9.1/docs/Data-Vector.html

答案 3 :(得分:2)

可以是关键字it may be a strictness annotation or bang pattern

! can also be a function name默认为中缀应用程序(也称为运算符),其中包含许多库示例,包括数组索引。

@ is a keyword for an as pattern (aka. view pattern)。它也可以是part of a function name like it is for several HUnit assertions

Interesting uses of bang patterns and view patterns在哈斯克尔学院进行了描述。