オペレータの定義では、exp
は必ずしも関数である必要はありません。演算子を定義した方法は、exp
です。何も機能するexp
パラメータを必要とし、あなたのオペレータの定義ではありませんので、これは、コンパイルしても、実行します
[0..1] ->>> 42
に
:たとえば、あなたがこれを行うことができます。それ以外に何か
exp
をループの本体内で何度も繰り返し評価したい場合は、それを関数にしてループの本体が呼び出していることを確認する必要があります。あなたにはそれのための要件がないので、最も簡単なものはunit -> 'a
でしょう。彼らはこのように表現exp()
機能を作り、タイプunit
の値を意味 - 括弧exp
後
let (->>>) lst exp = for i in lst do exp()
注意:あなたは本当にあなたがその使用から推論コンパイラを持つことができます、しかしその型を宣言する必要はありませんアプリケーション(すなわち、機能exp
は値()
に適用されます)。
printf "hi"
は機能ではないので、もちろんこの定義では[1..5] ->>> printf "hi"
と書くことはできません。だから代わりに書く必要があります:
[1..5] ->>> (fun() -> printf "hi")
これで5つの "hi"がプリントアウトされます。
これは、for .. do
の構文が実際には言語の特別な部分であり、標準ライブラリで定義された「ただ別の機能」ではないためです。巧妙な関数や演算子の定義では、実際には同じ効果を作り出すことはできません。
関数と演算子よりも複雑な構文を作成する方法を知りたい場合は、computation expressionsを参照してください。
ありがとうございます。この回答は高く評価されています。 – ozgur
より現実的な解決策は、ラムダが要素を受け取るようにすることです: '... do exp i'。これは 'printf" hi%d "'を使うことを可能にし、不器用な 'fun i - >'ラップアラウンドを必要としません。 – bytebuster
これはOPがやろうとしたことではありません。 –