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] 删除。
我来说两句