1

JS を使用する場合、関数を処理するためのオプションが 2 つあります。

var a = function() {};
var b = a;     // b is the function a itself.
var c = a();   // c is result of the evaluation of function a.

私の知る限り、Haskellはデフォルトで怠惰なので、常にデフォルトで取得bします。しかし、取得したい場合、どうすればcよいですか?

アップデート

はっきりと言葉を入れるべきだと思います。

でこんなことをしていましたghci

let a = getLine
a

getLineの結果を に入れたかったのaです。

Update2

私のような人々が後で参照できるように、このコードをメモします。@Ankur の助けを借りて、Haskell への翻訳を修正できました。a関数が何も返さないため、上記のコード例は適切ではありません。このように変更すると;

var a = function(x,y) { return x * y; };
var b = a;     // b is the function a itself.
var c = a();   // c is result of the evaluation of function a.

Haskellに翻訳するとこうなります。

let a = \ x y -> x* y    // Anonymous lambda function.
let b = a
let c = a 100 200        
4

3 に答える 3

2

JS コードは次のように Haskell に変換されます。

Prelude> let a = (\() -> ())
Prelude> let b = a
Prelude> let c = a()

あなたのJS関数はNothing(()型としてモデル化できます)を取り、何も返しませんでした。つまり、再び()

getLineは型の値なIO Stringので、いわば型の値let a = getLineaなりますIO String。あなたが望むのはString、 this からの抽出ですIO String。これは次のように実行できます。

a <- getLine

于 2013-10-09T09:44:45.307 に答える
0
  1. Haskell はnon strictであり、lazy ではありません。
  2. 多くの式は厳密に評価されます。ここを参照してください。そのため、多くの場合、コードの構造を単純に厳密にすることができます。
  3. Haskell ではc、戻り値の型 (値) に一致する型がある場合a()、それが割り当てられます (関数自体ではありません)。
  4. Haskell は、コードが実際に の値を必要とするまで計算を延期することがありますcが、ほとんどの場合、気にする必要はありません。

なぜ早期に評価を強制したいのですか?通常、Haskell でこれを行う唯一の理由はパフォーマンスです。あまり純粋でない言語では、副作用に依存しているかもしれませんが、Haskell ではそうではありません - たとえば IO モナドを扱っていて、それが逐次評価を強制するために必要なすべてを提供する場合を除きます。

更新ああ、あなたIOで作業しています。

于 2013-10-09T09:19:12.273 に答える