でカスタム演算子を定義するために、それはmember this.Map (f, s) ...
にmember this.Map f s ...
を変更ところで計算式
type ZipSeq() =
[<CustomOperation("<*>")>]
member this.Apply f s =
f |> Seq.zip s |> Seq.map (fun (y, x) -> x(y))
member this.Return x =
Seq.initInfinite (fun _ -> x)
// (a -> b) -> seq<a> -> seq<b>
[<CustomOperation("<!>")>]
member this.Map f s =
this.Apply (this.Return f) s
let zipSeq = new ZipSeq()
let f (a : float) = a * a
let s = seq { yield 1. }
// seq<b>
let h1 = zipSeq.Map f s
//thinking h1 should be the same as h2
//but compilation error : ` This value is not a function and cannot be applied`
let h2 = zipSeq { return f <!> s }
を動作させることはできませんどのように同じエラーを与えます。
私はそれが可能ではないと思います。しかし、それはクールだ。 – Tarmil
これらの演算子を別々に定義するだけで(つまり計算ビルダの一部ではなく)、この構文を実現し、モナドのインスタンスを返すようにする必要があります。これは 'let!' -edまたは 'return! ed。 –
他に何か提案してもらえますか? – baio