Ich habe Haskell für ein paar Wochen gelernt, und ich habe eine Frage über die Verwendung des Unterstrichs (_
) als Funktionsparameter. Ich denke, meine Frage wird mit einem konkreten Beispiel besser gestellt. Angenommen, ich möchte eine Funktion definieren, die das Element einer Liste basierend auf dem bereitgestellten Index extrahiert. Ja, ich weiß, dass (!!)
bereits vordefiniert ist. Die beiden Möglichkeiten, dass ich die Funktion definieren kann (ich bin sicher, dass es mehr gibt) sind die folgenden:Haskell Unterstrich vs. explizite Variable
Version 1
indexedElement :: [a] -> Int -> a
indexedElement xs n | n < 0 = error "Index can not be negative."
indexedElement [] n = error "Index must be smaller than the length of the list."
indexedElement (x:xs) 0 = x
indexedElement (x:xs) n = indexedElement xs (n - 1)
Version 2
indexedElement :: [a] -> Int -> a
indexedElement _ n | n < 0 = error "Index can not be negative."
indexedElement [] _ = error "Index must be smaller than the length of the list."
indexedElement (x:_) 0 = x
indexedElement (_:xs) n = indexedElement xs (n - 1)
Die beiden Versionen sind offensichtlich sehr ähnlich. Der einzige Unterschied zwischen den beiden ist die Verwendung einer expliziten Variable oder eines Unterstrichs. Für mich bedeutet _
, dass buchstäblich alles dort geschrieben werden kann, während eine explizite Variable wie n
es offensichtlicher macht, dass das Argument eine ganze Zahl sein muss. Aus diesem Grund bevorzuge ich Version 1; aber der GHC-Quellcode für (!!)
ist wie Version 2 geschrieben. Gibt es einen funktionalen Vorteil der zweiten Version? Wenn nicht, würden "hardcore" Haskell Programmierer Probleme mit Version 1 haben? Ich verstehe die Wichtigkeit einer konsistenten Art Code zu schreiben, also versuche ich die "ungeschriebenen Regeln" für die Programmierung in einer bestimmten Sprache zu befolgen. Dies ist ein Beispiel, bei dem ich die erste Version sehr bevorzuge, und ich glaube nicht, dass dies den Code schwieriger zu lesen macht. Ich weiß nicht, ob es aufgrund meines Mathe-Hintergrundes oder so ist, aber ich würde gerne hören, was Sie als erfahrene Haskell-Tierärzte denken.
Ich bin über die Leistungsunterschiede nicht sicher (Sie könnten versuchen, Ausgabe des Kerns beider Versionen, um zu sehen, ob es Unterschiede gibt), aber die meisten haskeller bevorzugen die zweite Version, da sie die Anzahl der Namen reduziert, die gebunden werden müssen. Das '_ 'bedeutet, dass jeder Wert dorthin gehen kann (solange es der richtige Typ ist, der durch die Typensignatur gegeben ist. Es mag zwar natürlicher erscheinen,' n' zu verwenden, um eine ganze Zahl anzugeben, auch wenn sie nicht verwendet wird.) Denken Sie daran, dass nicht jeder diese Voreingenommenheit haben wird – bheklilr
Sie können einen Kompromiss eingehen, indem Sie die Variable '_n' benennen, die die Warnungen bei Verwendung von' -Wall' ausschaltet, anzeigt, dass die Variable nicht verwendet wird und sie gleichzeitig benennt. – luqui
@bheklilr Okay, ich schätze Ihre Eingabe.Ich werde mich selbst trainieren, um mit '_' besser zu werden. Danke, – basketballfan22