我敢肯定,我碰到了某種限制,但我不明白:可能的F#類型推斷限制
type IRunner =
abstract member Run : (string -> 'a) -> 'a
type T() =
let run4 doFun = doFun "4"
let run5 doFun = doFun "5"
let parseInt s = System.Int32.Parse(s)
let parseFloat s = System.Double.Parse(s)
let doSomething() =
let i = parseInt |> run4
let f = parseFloat |> run4
f |> ignore
// Make it more generic ->
//let doSomething2 (runner:(string->'a)->'b) =
let doSomething2 runner =
// Error on the following lines with both declarations
let i = parseInt |> runner
let f = parseFloat |> runner
f |> ignore
// Want to do something like
let test() =
doSomething2 run4
doSomething2 run5
// Workaround
let workaround (runner:IRunner) =
let run f = runner.Run f
let i = parseInt |> run
let f = parseFloat |> run
f |> ignore
有人可以帶來一些輕了呢?我沒有找到任何相關的問題,對不起,如果我複製了一些東西。
你感覺像編程在一個非常高的水平,然後像這樣的東西即將出現有點傷心。 我覺得應該可以採取任何「run4」,並使其成爲一個參數。 – matthid 2012-07-18 19:07:50
有些語言支持通用限定符,比如我對'doSomething2'的假設定義,但我相信類型推斷在這些語言中是不可判定的 - 您需要一個明確的註釋來定義這樣的函數。 – kvb 2012-07-18 19:25:39
感謝您的補充說明。 – matthid 2012-07-18 19:34:34