2014-02-24 20 views
10

有写在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) 

什么了 “!!”意思?

+9

这是一个非常有效的问题,如果你没有意识到这一点!只是一个运营商。对haskell新手的编码器还不知道!并不是他们没有遇到过的特殊语法。让我们对那些对我们的语言很陌生的人保持温柔。 –

回答

20

这实际上是比较难读那就先看起来,在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中存在的操作符,那很难以精神分析上面的代码。

+0

很好的答案,但基于这个问题可能需要提及操作符部分。 –