2017-10-12 2 views
2

こんにちは私はF#の学習を始めました。そして、あなたは関数の入出力のタイプを制約できるかどうか疑問に思っています。F#で関数に固有の型シグネチャを付けることはできますか?

main : unit 
let main = printf "Hello World\n" |> (fun x -> printf "Goodbye World\n") 
let _ = main 

をし、私はまた、最初の行にmainletを入れてみました:

私はこれをやってみました。どちらもうまくいかなかった。 F#でこのようなことをする方法はありますか?私はそれがハスケルの素晴らしい特徴だと思う。

答えて

4

はい、これは完全に可能である:

また
let main : unit = printf "Hello World\n" |> (fun x -> printf "Goodbye World\n") 

、カップルマイナーポイント:代わりに\n

まず、最後に、あなたがprintfnを使用することができます。

第2に、ラムダ式のxは冗長であり、ラムダ式自体も同様である。

let main : unit = 
    printfn "Hello World" 
    printfn "Goodbye World" 

第三に、あなたは関数を定義しますが、ていないこの方法:複数の呼び出しを配列決定するためには、単純に、順番に新しい行(またはセミコロンで区切られた)上の各それらを一覧表示することができます。 F#は、Haskellとは異なり、遅延評価されていないので、この定義の全身は、スコープが始まるとすぐに、あなたが呼び出すたびに実行されるのではなく、一度実行されます。関数を定義する場合は、いくつかのパラメータを与えます。あなたはそれを与えるために意味のあるパラメータを持っていない場合は、その単一unit値行います。それらは暗黙のうちに、たとえば次のコードを拘束されているが

let main() : unit = 
    printfn "Hello World" 
    printfn "Goodbye World" 
1

入力と出力が拘束されています。

let add1int arg = number+1 
let add1double arg = number+1.0 

関数add1intはintをとり、intを返します。 argの値が別のintに追加されるため、コンパイラはこれを認識します。同様に、add1doubleはdoubleをとり、doubleを返します。

しかし、入力と出力の型をコンパイラに任せるのではなく、明示的に宣言したい場合(これによって、いくつかの箇所で読みやすくなります)。

let add1int (number:int):int = number+1 
let add1double (number:double):double = number+1.0 
+2

ただ、F#構文に慣れていないのですOPのための構文を明確にするために、各パラメータの型宣言は、その周りに括弧を必要とし、括弧なしの型宣言は、(これらのいずれかの最大値が存在することができる)のタイプを宣言します関数の戻り値char型の関数を宣言する 'let f(x:int):string'は' int - > string'型の関数を宣言し、 'let g(c:char)(n:int) > int - > string'となります。 – rmunn

関連する問題