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
으로 수정하므로 seq
과 동일한 xform을 사용할 수 없으며 적어도 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-stay-loose? lq = 1 –