这实际上是比较难读那就先看起来,在Haskell运营商更通用则在其他语言。
我们都想要告诉你的第一件事就是自己去看看。如果您还不知道hoogle,那么现在就该熟悉它了。你可以要求它告诉你函数按名称做了什么,或者(这更酷),你可以给它一个函数的类型,它可以提供关于哪个函数实现该类型的建议。
这里是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
在Java,C或Ruby中会像xs[i]
一样工作。
现在我们需要谈谈运营商如何在哈斯克尔工作。我不会在这里给你所有的东西,但我至少会让你知道,在这里有更多的东西,那么你会在其他编程语言中遇到什么。运营商“总是”采取两个参数并返回一些内容(a -> b -> c
)。您可以使用它们就像一个正常的功能:
add x y
(+) x y -- same as above
但是,默认情况下,你也可以表达与使用它们(这个词是“缀”)。你也可以做一个正常功能的工作就像一个操作员backtics:
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中存在的操作符,那很难以精神分析上面的代码。
这是一个非常有效的问题,如果你没有意识到这一点!只是一个运营商。对haskell新手的编码器还不知道!并不是他们没有遇到过的特殊语法。让我们对那些对我们的语言很陌生的人保持温柔。 –