Idrisで遊んだあと、の明示的なタイプを使用して、私のF#プログラムの宣言的自己文書化を強くすることになりました。F#に2種類の明示的な型宣言があるのはなぜですか?
の明示的な型を定義するは、F#が実際に関数に対して2つのスタイルの明示的な型を持っていることを再発見しました。 :
を使用して標準関数関数スタイルがあり、->
を使用するラムダ関数があります。例えば
は
// explicitly typed function using the classical let ':' style
let OK1 (content : string) (context : Context) : Async<Context option> =
{ context with Response = { Content = content; StatusCode = 200 } }
|> Some
|> async.Return
// explicitly typed function using the '->' style
let OK2 : string -> Context -> Async<Context option> = fun content context ->
{ context with Response = { Content = content; StatusCode = 200 } }
|> Some
|> async.Return
->
スタイルのいいところは、私はそれを宣言することだと思うし、同じを使用しないよう
// type alias defining a webpart
type WebPart = Context -> Async<Context option>
// using the type alias in the declaration of an explicitly typed function
let OK2 : string -> WebPart = fun content context ->
{ context with Response = { Content = content; StatusCode = 200 } }
|> Some
|> async.Return
として、私は型の別名を定義することができるということです:
スタイルのエイリアス... ...?
なぜF#には、関数に明示的な型を宣言する2つのスタイルがあるのか不思議です。それは何らかの.Net制限ですか?それとも特別な目的を持っていますか? :
ではなく、すべての明示的な型を->
で定義してみませんか?
私は提示されたケースに同意します。この例は明示的な型とは関係がないようですが。私は主にラムダスタイルと 'ノーマル'スタイルの間で明示的な型定義が異なることに興味があります。通常のスタイルでは、明示的な型宣言で 'type WebPart = Context - > Async'のような型エイリアスを使用する能力が失われているようです。 –
Michelrandahl
http://stackoverflow.com/questions/39394254/value-restriction-the-type-bar-has-been-inferred-to-have-generic-typeと比較してください。その点で、「2つのオプションは完全に同等です」というステートメントは成立しない可能性があります。しかし、確かに。 – BitTickler
はい、そのコンテキストでその概念は成り立ちます。 'foo'は普通の関数です。その定義は' let foo a b = ... 'と同じですが、' bar'は異なります。 –