2014-02-24 19 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

很好的答案,但基於這個問題可能需要提及操作符部分。 –