2

是什么(n+1)意思?我知道两者都是递归 Haskell 函数并且正在使用模式匹配。

我不明白它将如何进行模式匹配factorial (n+1)以及.(n+1)factorial =

drop功能为什么会这样drop 0 xs = xs?那么drop (n+1) [] = []呢?

--Example 1
factorial 0 = 1
factorial (n+1) = (n+1) * factorial n

--Example 2
drop :: Int -> [a] -> [a]
drop 0 xs = xs
drop (n+1) [] = []
drop (n+1) (_:xs) = drop n xs

顺便说一句,我在编译时遇到错误。

  • 代码编译失败
  • 模式中的解析错误:n + 1

更新:感谢您指出正确的术语。我发现了这个n+k 模式。由于自 2010 年以来已删除 n+k 模式,我还发现了这个关于如何启用此模式的问题。

4

3 回答 3

7

这些是NPlusKPatterns2010 年从语言中删除的,现在仅适用于上述语言扩展。

一个n + k模式

drop (n+1) [] = []

绑定n到参数值减一,前提是参数值为>= 1. 模式与参数不匹配<= 0

因此,如果

drop :: Int -> [a] -> [a]
drop 0 xs = xs
drop (n+1) [] = []
drop (n+1) (_:xs) = drop n xs

使用否定Int参数调用,例如

drop (-2) "foo"

没有模式匹配,你会得到一个例外。

一般来说,如果你定义(举个愚蠢的例子)

foo :: Int -> Int
foo (n+5) = 3*n
foo (n+2) = n
foo (n+1) = 2*n

如果您调用foo 7,第一个模式匹配并将n绑定到2,所以foo 7 = 6。如果您调用foo 3,第一个模式不匹配 ( 3-5 = -2 < 0),但第二个匹配,并且绑定n3-2 = 1,因此foo 3 = 1. 如果你调用foo 1,前两个模式都不匹配,但最后一个匹配,然后n绑定到1 - 1 = 0,所以foo 1 = 0foo使用参数调用< 1会引发异常。

并带有 drop 功能,为什么会这样drop 0 xs = xs?那么drop (n+1) [] = []呢?

好吧,drop 0从列表的前面删除 0 个元素,因此它根本不会更改列表参数。而且您不能从空列表中删除元素,因此drop (n+1) [] = []除了引发错误之外,您唯一可以做的就是。

于 2013-06-26T11:23:40.520 回答
6

这就是所谓的n+k模式。该模式(n+1)匹配任何正整数并给出n该整数的值减一。因此,如果您调用drop 1 xs的值为n0。

为什么drop 0 xs = xs

因为如果从列表中删除 0 个元素,最终会得到相同的列表。

那么drop (n+1) [] = []呢?

这就是说,如果您从空列表中删除任何数量的项目,您最终会得到一个仍然为空的列表。除了因错误消息而失败之外,在这种情况下,这确实是您可以做的唯一明智的事情。

于 2013-06-26T11:23:52.383 回答
3

您提供的代码使用的功能称为NPlusKPatterns不再是标准haskell 的一部分(不在haskell2010标准中),但可以通过将行 {-# LANGUAGE NPlusKPatterns #-}放在源文件的顶部来“导入”它。

让我们看一个如何使用它的示例:

myFunction 0 = 0
myFunction (n+1) = n

这个功能有点傻。如果输入是,0那么结果是0。对于正输入数m,结果是m - 1,或者换一种说法,对于正输入数n+1,结果是n。该函数对于负数是未定义的,因为该(n+1)模式与负数不匹配。

现在假设我将我的功能更改为

myFunction 0 = 0
myFunction (n+1) = (n+1)

现在左侧做了一些魔术。它声明了n一个减去输入的变量。另一方面,右侧与(+)操作员一起添加一个。

至于您对drop功能的问题。drop 0 xs = xs意味着0从列表中删除元素不会更改列表。drop (n+1) [] = []只是从空列表中删除任何正数的元素就是空列表。

drop来自报告的定义haskell2010是:

drop n xs     | n <= 0 =  xs
drop _ []              =  []
drop n (_:xs)          =  drop (n-1) xs

它的行为有些不同,因为它是为负数定义的。

于 2013-06-26T13:25:52.653 回答