F# で Clojure Transducers の実装を試していたところ、恐ろしい値制限エラーにすぐに遭遇しました。
トランスデューサーの要点は、構成可能であることです。これはいくつかのサンプルコードです:
type Reducer<'a,'b,'c> = ('a -> 'b -> 'a) -> 'a -> 'c -> 'a
module Transducers =
[<GeneralizableValue>]
let inline map proj : Reducer<'result,'output,'input> =
fun xf ->
fun result input ->
xf result (proj input)
let inline conj xs x = x :: xs
let inline toList xf input = List.fold (xf conj) [] input
let xform = map (fun i -> i + 9) >> map (fun a -> a * 5)
//let xs = toList xform [1;2] // if you apply this, type will be fixed to 'a list
// which makes xform unusable with eg 'a seq
GeneralizableValue
値の制限を解除するはずでしたが、何もしていないようです。あなたの使命は、このコードを適用せずにコンパイルすることですtoList
(型推論は型を に固定する'a list
ため、同じ xform を で使用することはできませんseq
)、xform の型を変更することはありません (少なくとも、そうしないようにする方法ではありません)。構成可能)。これは単に F# では不可能なのでしょうか?