Я экспериментировал с реализацией Clojure Transducers в F # и быстро попадал в ужасную ошибку ограничения значения.Проблемы с ограничением стоимости
Вся суть преобразователей должна быть составной. Это некоторые примеры кода:
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 #?
Что случилось с просто добавлением аргумента в 'xform', как показывает ошибка? то есть «let xform x = x |> map ...' –
Хм, кажется, вы достигли предела вывода типа F #. http://stackoverflow.com/questions/1131456/understanding-f-value-restriction-errors –
И немного больше анализа здесь: http://stackoverflow.com/questions/1809405/forcing-f-type-inference-on -generics-and-interfaces-to-stay-loose? lq = 1 –