2009-04-22 11 views
1

私はF# Wikibook on High Order Functionsのいくつかの例に従っていました。F#関数が "val FunctionName:int - > int"のシグネチャを返すのはなぜですか?

タイトルの下にある2番目のコードスニペット構成機能には次のコードスニペットがあります。

#light 
open System 

let compose f g x = f (g x) 

let xSquared x = x*x 
let negXPlusFive x = -x/2.0 + 5.0 

let fog = compose xSquared negXPlusFive 

// ... Console.WriteLine statements.... 

私は問題の理解を持っています一つは、私は、それ自体でF#対話型シェル(fsi.exe)でそれを実行すると、私は次のシグネチャを取得

let xSquared x = x*x 

です。

> let xSquared x = x*x;; 

val xSquared : int -> int 

しかし、私は全体のコードスニペットを実行すると、以下のxSquaredを返します。

val compose : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b 
val xSquared : float -> float 
val negXPlusFive : float -> float 
val fog : (float -> float) 

なぜxSquaredfloatを取り、floatを返すのですか?

答えて

3

詳細については、F#ではfloat引数を使用してxSquaredが呼び出されたと判断することができます。あなたがnegXPlusFiveを "let negXPlusFive x = -x + 5"のように変更すると、それは霧とxSquaredが "int - > int"になることがわかります。セバスチャンが言ったことに拡張すること

+0

F#は、メソッドが作成されたコンテキストについてF#がどれだけ知っているかによって、引数の型を推測するようです。ありがとう。 – Sung

+0

F#は、値の多型性を制限する必要がある場合にのみこれを行います。この場合、xを 'a'にすることはできません。単一のタイプに制限する必要があります。 – MichaelGG

11

と何jleedevタグ付けされた、などの機能:

let xSquared x = x*x 

は*演算子を持っているタイプ上で動作することができます。デフォルトでは、intはこれらの状況で勝ちます。それは本当に一般的ではありません。なぜなら、.NETには「*が付いているあらゆる型」という制約を表現する方法がないからです。

ただし、F#はインライン展開をサポートしているため、各コールサイトにインライン展開されるため、関数をより汎用的にすることができます。これにより、浮動小数点数、整数などで動作するxSquaredのような関数を持つことができます。

> let inline xSquared x = x*x;; 

val inline xSquared : 
    ^a -> ^b when ^a : (static member (*) : ^a * ^a -> ^b) 

ここで、機能タイプが^ a - >^bであることに注目してください。これは型変数が静的に解決されなければならないことを除いて 'a - >' bに似ています。 F#には型抜きがないため、これは演算子の処理方法です。

あなたが実際にあなたが望むものは何でもする*それ自身でメンバーを独自の型を定義することができ、そしてそれはxSquaredで作業したい:あなたのF#のディストリビューションに

type Foo(x) = 
    member this.Y = x - 1 
    static member (*) (x:Foo, y:Foo) = string <| x.Y * y.Y + 1 

let a = Foo(10);; 

type Foo = 
    class 
    new : x:int -> Foo 
    member Y : int 
    static member (*) : x:Foo * y:Foo -> string 
    end 
val a : Foo 

> xSquared a;; 
val it : string = "82" 

ただ、オープンプリム-types.fsをして突きますまわり。 2200行目は>>>などの定義で、インライン展開やその他の素晴らしいことを示しています。

+0

ありがとう、MichaelGGより詳しい説明 – Sung

+0

クール、私はここで何かを学んだ! – Benjol

関連する問題