【发布时间】:2013-07-21 11:08:18
【问题描述】:
这是一个参考问题:StackOverflow in continuation monad
我和谁玩了一点,需要澄清一下。
1) 我想是这样的:
member this.Delay(mk) = fun c -> mk () c
使计算工作流中的行为在这些之间做出 toyvo 所示的差异:
cBind (map xs) (fun xs -> cReturn (f x :: xs))
cBind (fun c -> map xs c) (fun xs -> cReturn (f x :: xs))
所以我不完全明白什么是诀窍,当(fun c -> map xs c) 只是 (map xs) 的不同表示法
2) 推理问题。 - 在 OP 的第二个地图示例中,我发现由于v 值的推断问题,它无法编译,因为它将f 推断为a -> b list,而不是所需的a -> b。为什么它以这种方式推断?如果let v = f x 会很好地推断出来。
3) 在我看来,VS 在工具提示中显示了不准确的类型签名:
monad的Return的返回类型是:('e->'f)->f,而Bind的返回类型只有'c->'b。 - 在 Bind 情况下,它似乎将('e->'f) 简化为仅c,还是我在这里遗漏了什么?
感谢您的澄清,
托马斯
编辑 - 测试转储:
let cReturn x = fun k -> k x
let cBind m f =
printfn "cBind %A" <| m id
fun c -> m (fun a -> f a c)
let map_fixed f xs =
let rec map xs =
printfn "map %A" xs
match xs with
| [] -> cReturn []
| x :: xs -> cBind (fun c -> map xs c) (fun xs -> cReturn (f x :: xs))
map xs (fun x -> x)
let map f xs =
let rec map xs =
printfn "map %A" xs
match xs with
| [] -> cReturn []
| x :: xs -> cBind (map xs) (fun xs -> cReturn (f x :: xs))
map xs (fun x -> x)
[1..2] |> map_fixed ((+) 1) |> printfn "%A"
[1..2] |> map ((+) 1) |> printfn "%A"
地图固定:
地图 [1; 2]
地图 [2]
地图 []
c绑定 []
地图 []
c绑定 [3]
地图 [2]
地图 []
c绑定 []
地图 []
[2; 3]
地图:
地图 [1; 2]
地图 [2]
地图 []
c绑定 []
c绑定 [3]
[2; 3]
修改问题 2:
let map f xs =
let rec map xs =
cont {
match xs with
| [] -> return []
| x :: xs ->
let v = f x // Inference ok
//let! v = cont { return f x } // ! Inference issue - question 2
let! xs = map xs
return v :: xs
}
map xs id
【问题讨论】:
-
关于你的第二个问题,推理似乎对我来说很好。
-
如果我取消注释 //let!.. 它会给我:类型不匹配。期待一个 'a 但给出了一个 'a 列表
-
我终于看到了错误 - 在我的绑定定义中 - 与第 1 点类似的日志 - 愚蠢的我,感谢您的关注。
标签: f# workflow stack-overflow monads continuation