2014-02-24 13 views
10

Es gibt zwei in der Haskell wiki Website geschrieben Funktionen:Was bedeutet "!!" gemein in haskell?

Funktion 1

fib = (map fib' [0 ..] !!) 
    where 
     fib' 0 = 0 
     fib' 1 = 1 
     fib' n = fib (n - 1) + fib (n - 2) 

Funktion 2

fib x = map fib' [0 ..] !! x 
    where 
     fib' 0 = 0 
     fib' 1 = 1 
     fib' n = fib (n - 1) + fib (n - 2) 

Was die "!!" tut bedeuten?

+9

Dies ist eine sehr gültige Frage, wenn Sie das nicht merken !! ist nur ein Operator. Coders neu in Haskell wird das noch nicht wissen !! ist keine spezielle Syntax, die sie nicht kennen. Lasst uns sanft mit denen sein, die neu in unserer Sprache sind. –

Antwort

20

Dies ist eigentlich schwieriger ist, dann lesen sie zunächst als Betreiber in Haskell sind allgemeinere dann in anderen Sprachen erscheinen würde.

Das erste, worüber wir uns alle Gedanken machen, ist, selbst nachzusehen. Wenn Sie nicht bereits über hoogle wissen, ist es an der Zeit, sich damit vertraut zu machen. Sie können es entweder fragen, um zu sagen, was eine Funktion mit dem Namen macht oder (und das ist noch cooler) Sie können ihm den Typ einer Funktion geben und er kann Vorschläge geben, welche Funktion diesen Typ implementiert.

Hier ist, was Hoogle erfahren Sie Näheres zu dieser Funktion (Betreiber):

(!!) :: [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. 

Nehmen wir an, dass Sie helfen, diese zu lesen brauchen. Die erste Zeile sagen uns, dass (!!) ist eine Funktion, die eine Liste von Dingen ([a]) und eine Int nimmt dann gibt Ihnen eines der Sache in der Liste (a). Die Beschreibungen sagen Ihnen, was es tut. Es gibt Ihnen das Element der Liste, die durch die Int indiziert wird. Also, xs !! i funktioniert wie xs[i] würde in Java, C oder Ruby.

Jetzt müssen wir darüber reden, wie Operatoren in Haskell arbeiten. Ich werde dir hier nicht alles geben, aber ich werde dich wenigstens wissen lassen, dass es hier etwas mehr gibt, als in anderen Programmiersprachen. Operatoren nehmen "immer" zwei Argumente und geben etwas zurück (a -> b -> c). Sie können sie wie eine normale Funktion:

add x y 
(+) x y -- same as above 

aber in der Standardeinstellung können Sie diese auch zwischen Ausdruck verwenden (das Wort dafür ist ‚Infix‘). Sie können auch eine normale Funktion der Arbeit wie ein Operator mit backtics machen:

x + y 
x `add` y -- same as above 

Was das ersten Codebeispiel macht (vor allem für neuen Haskell Programmierer) ergeben, dass der !! Operator als Funktion verwendet wird, eher dann in einem typische Position des Bedieners (Infix). Lassen Sie mich einige Bindung hinzufügen, damit es klarer ist:

-- 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) 

Sie jetzt Ihren Weg zurück zum Beispiel 1. Stellen Sie sicher, dass Sie map fib' [0 ..] Mittel zu verstehen, was funktionieren kann.

Es tut mir leid, dass Ihre Frage abgelehnt wurde, denn wenn Sie verstanden, was los war, wäre die Antwort leicht zu finden, aber wenn Sie nichts über Operatoren wissen, wie die in Haskell existieren, ist es sehr schwer mental den obigen Code analysieren.

+0

Gute Antwort, aber basierend auf der Frage muss wahrscheinlich Bedienerabschnitte zu erwähnen. –