“ !!”是什么意思 在haskell中是什么意思?

用户名

Haskell Wiki网站上编写了两个功能

功能1

fib = (map fib' [0 ..] !!)
    where
      fib' 0 = 0
      fib' 1 = 1
      fib' n = fib (n - 1) + fib (n - 2)

功能2

fib x = map fib' [0 ..] !! x
    where
      fib' 0 = 0
      fib' 1 = 1
      fib' n = fib (n - 1) + fib (n - 2)

什么是“ !!” 意思?

约翰·米勒

实际上,这比最初看起来更难阅读,因为与其他语言相比,haskell中的运算符更加通用。

我们所有人都想告诉您的第一件事就是亲自检查一下。如果您还不了解钩子,那么现在该熟悉一下。您可以要求它告诉您函数按名称执行的功能,或者(更酷的是)您可以给它提供函数的类型,并且可以提供有关实现该类型的函数的建议。

这是hoogle告诉您的有关此功能(操作员)的信息:

(!!) :: [a] -> Int -> a

List index (subscript) operator, starting from 0. It is an 
instance of the more general genericIndex, which takes an index     
of any integral type.

让我们假设您在阅读本文时需要帮助。第一行告诉我们这(!!)是一个函数,它接收事物列表([a]),Int然后返回给您列表中的事物(a)。说明告诉您它的作用。它将为您提供由索引的列表元素Int因此,xs !! i就像xs[i]在Java,C或Ruby中一样。

现在,我们需要讨论操作员如何在Haskell中工作。我不会在这里给您提供全部内容,但是至少我会让您知道,这里还有比您在其他编程语言中会遇到的更多的东西。运算符“总是”接受两个参数并返回一些值(a -> b -> c)。您可以像正常功能一样使用它们:

add x y
(+) x y -- same as above

但是,默认情况下,您也可以在表达式之间使用它们(此词为“中缀”)。您还可以使普通函数像带有后退符的运算符一样工作:

x + y
x `add` y -- same as above

使您给出的第一个代码示例(特别是对于新的Haskell编码器)的原因是,!!运算符被用作函数,而不是在典型的运算符(中缀)位置。让我添加一些绑定,这样更清楚:

-- return the ith Fibonacci number
fib :: Int -> Int  -- (actually more general than this but do't worry about it) 
fib i = fibs !! i
    where
      fibs :: [Int]
      fibs = map fib' [0 ..]

      fib' :: Int -> Int
      fib' 0 = 0
      fib' 1 = 1
      fib' n = fib (n - 1) + fib (n - 2)

现在,您可以回到示例1。确保您了解map fib' [0 ..]含义。

很抱歉,您的问题被否决了,因为如果您了解答案的内容将很容易查找,但是如果您不知道运算符是haskell中的存在,则很难从心理上解析该问题。上面的代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档