gpt4 book ai didi

模式匹配中的 Haskell (n+1)

转载 作者:行者123 更新时间:2023-12-02 07:12:22 30 4
gpt4 key购买 nike

我正在做99 Problems in Haskell当我遇到solutionProblem 19我没有完全理解。

任务是编写一个像这样工作的旋转函数

*Main> rotate ['a','b','c','d','e','f','g','h'] 3
"defghabc"

*Main> rotate ['a','b','c','d','e','f','g','h'] (-2)
"ghabcdef"

提供的一种解决方案是

rotate [] _ = []
rotate l 0 = l
rotate (x:xs) (n+1) = rotate (xs ++ [x]) n
rotate l n = rotate l (length l + n)

我不明白模式匹配如何到达第四行。这似乎与 (n+1) 有关,因此当 n 为负数时,第三行不匹配,因此采用第四行。如果是这种情况,为什么符号 (n+1) 会以这种方式工作。这不是任意的还是我不知道的约定(数学?)?

因为我理解的方式是在第三行递归调用rotate,参数n减一。所以我认为

rotate [] _ = []
rotate l 0 = l
rotate (x:xs) n = rotate (xs ++ [x]) (n-1)
rotate l n = rotate l (length l + n)

是等价的。然而,事实并非如此。该定义给出了以下警告

Warning: Pattern match(es) are overlapped
In the definition of `rotate': rotate l n = ...

而前一个定义编译得很好。

最佳答案

这是所谓的“n+k 模式”的具体情况,这种模式通常不受欢迎,并且 will be has been removed from the language 。请参阅here了解更多信息。

Here是关于 n+k 模式的一个很好的注释,它引用了 Haskell 98 报告中的以下内容(重点是我的):

Matching an n+k pattern (where n is a variable and k is a positive integer literal) against a value v succeeds if x >= k, resulting in the binding of n to x - k, and fails otherwise. Again, the functions >= and - are overloaded, depending on the type of the pattern. The match diverges if the comparison diverges.

The interpretation of the literal k is the same as in numeric literal patterns, except that only integer literals are allowed.

因此,只有当 n 至少为 1 时,n+1 才会匹配,正如您所怀疑的那样。您的替代代码删除了此限制,导致模式匹配重叠。

关于模式匹配中的 Haskell (n+1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4913588/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com