2010-12-19 5 views
4

Das Folgende funktioniert gut, wie man es bei einem System vom Typ des polymorphen Curry-Typs erwarten würde, wo z.B. die Identitätsfunktion ist eigentlich eine unendliche Familie von Funktionen, eine für jeden Typ ‚a ->‘ a:F # polymorphe Typen

let f x = x 
printfn "%A" (f 2) 
printfn "%A" (f 3.4) 

Aber wenn wir versuchen, etwas ein wenig komplizierter zu machen, es scheitert in der dritten Zeile, „das Ausdruck wurde erwartet, Typ int haben, aber hier hat Schwimmer Typ ":

let f x = string x 
printfn "%A" (f 2) 
printfn "%A" (f 3.4) 

(aber die zweite Zeile die dritte Zeile Arbeit macht Kommentierung aus, wie erwartet.)

A priori würde ich Typ erwartet Rückschluss auf beide Verhalten Curry-Stil, wo ein unspezifizierter Typ ist effektiv ein generisch, oder auch, um nur eine Version der Funktion zu sperren, aber soweit ich sehen kann, macht es ersteres im ersten Fall und letzteres im zweiten Fall. Ich vermute, dass hinter dem Verhalten, das ich gerade nicht aufnehme, eine gewisse Logik steckt. Was vermisse ich?

Antwort

6

Es gibt eine nicht-Standard-Sache hier mit "Hat-Typen". Einige F # -Funktionen wie 'string' haben Typen, die auf statischen Optimierungsbedingungen oder der Existenz bestimmter Elementfunktionen basieren. Diese können nur in Inline-Funktionen verallgemeinert werden, ansonsten nehmen sie einen monomorphen Typ an, der auf der Verwendung basiert, und genau das passiert hier.

+6

Um nur ein wenig zu erläutern, bedeutet dies, dass "let inline f x = string x" das zweite Beispiel wie das erste verhalten lässt. – kvb