20

F#を使用すると、演算子を:で囲むことで関数に変換できます。( )たとえば、(+)タイプはint -> int -> intです。

list cons演算子を使用してこれを行うことは可能::ですか?

通常の二項演算子のようには動作しません。

FSI> (::);;

  (::);;
  -^^

c:\temp\stdin(3,2): error FS0010: Unexpected symbol '::' in expression.
Expected ')' or other token.

そして、このList.Consメソッドはタプルを取ります。カレーではありません。

(これができると便利です。たとえば、foldの観点からマップを実装するために使用できます)。

4

3 に答える 3

17

http://cs.hubfs.net/forums/permalink/11713/11713/ShowThread.aspx#11713から言い換えます

(::)は、の識別された共用体「コンストラクター」であるためlist<'a> type、関数値としてその引数をカレー(のように+)にするか、(すべてのDUコンストラクターのように)4倍にするかという問題が発生しました。どちらの方法も、一部の人にとっては怪しい/予期しないように見えるため、F#は単に構成を許可しません。

もちろん、いつでも書くことができます。

let cons x y = x :: y

このために「2つの引数のカレープレフィックス関数」が必要な場合は、を使用consするか、ラムダを使用します。fun x y -> x::y

于 2010-09-29T17:08:15.377 に答える
6

残念ながら、できません。 は演算子ではありませんが、言語文法 (仕様のセクション 3.6 を参照)::によると、「記号キーワード」であり、他のいくつかのキーワードと同様です。ただし、演​​算子であるかのように扱うことができるシンボリック キーワードがいくつかあるため (少なくともand )、ここでは言語が完全に一致しているようには見えません。:?>(*)(<@ @>)

于 2010-09-29T12:38:04.883 に答える
4

::とは、それぞれ[]とで表すことができます。ただし、前者はタプルを引数として取ることに注意してください。これらはここにあるので、F#以外の言語でリストを作成できます。List<_>.ConsList<_>.Empty

> List.Cons(4, List.Empty);;
val it : int list = [4]

> 4::[];;
val it : int list = [4]

> List<int>.Cons(4, List<int>.Empty);;
val it : int list = [4]

> List.Cons;;
val it : 'a * 'a list -> 'a list = <fun:clo@24-7> //'

> List<int>.Empty;;
val it : int list = []
于 2010-09-29T16:28:22.190 に答える