這實際上是比較難讀那就先看起來,在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新手的編碼器還不知道!並不是他們沒有遇到過的特殊語法。讓我們對那些對我們的語言很陌生的人保持溫柔。 –