2016-07-12 23 views
4

次のコードを実行すると、mySumから5050が出力されます。私はmySumを定義しましたが、それを呼び出すことはありません。どのようにして印刷することができますか?たぶんこれは私の背景がハスケルであり、物事をやるためにIOモナドを渡すことに慣れていたので、これは変です - どのように/いつF#で評価されますか?なぜprintfnはf#ですぐに印刷されますか?

type main = obj [] -> int 

let mySum = [1..100] |> List.sum |> printfn "%i" 


[<EntryPoint>] 
let main argv = 
    0 

答えて

13

私はmySumを定義し、それを呼び出したことがありません。

mySumはパラメータを必要としないため、関数ではありません。関数には少なくとも1つの引数が必要です。 「役に立たない」ものを渡すことができない場合は、通常unitの値()になります。

mySumは値です。具体的には、表現[1..100] |> List.sum |> printfn "%i"の値をmySumという名前にバインドしています。その値は()であり、printfnは副作用の原因となり、unitを返します。値がバインドされるとすぐに式が評価され、残っているのはすべて副作用と実際の値です。機能として

mySumは次のようになります。

let mySum() = [1..100] |> List.sum |> printfn "%i" 

そして、単にプリントアウトする価値5050、との戻り値を引き起こす

mySum() 

だろう、それを呼び出すことが()は自動的に無視されます。

+3

これはとても奇妙です。価値は何ですか? 5は5を返す関数ではありませんか?非常に異なるパラダイム。 – Carbon

+3

'5'が' 5'を返す関数だった場合、 '5'も' 5'を返す関数なのでしょうか?ある時点で値を持つ必要があります。万が一ハスケルから来ていますか? –

+2

ハスケルの私の非常に限られた(そしてそれほど肯定的ではない)経験からの私の個人的意見は、F#に最初に入るためには、実際に多少異なるアプローチがあるため、ハスケルの考え方はあまり役に立ちません。ここで注意すべき最も重要なことは、Haskellとは異なり、F#は純粋な(ly)関数型言語ではないということです。 F#とそれに特有の "quirks"がより自然になると、Haskellの思考はおそらくもっと価値が増します。 – TeaDrivenDev

関連する問題