我并不确定该用单子来实现这个功能,或者是否应该使用单子进行解决,如果单子不是最佳方案,我会寻找其他解决方法。
假设我有以下代码(经过简化,但思路在这里):
module IM = Map.Make (Int)
let f k v m =
if IM.mem k m then (m, true)
else (IM.add k v m, false)
let a =
let m = IM.empty in
let m, res = f 0 "Zero" m in
if res then
let m, res = f 1 "One" m in
if res then f 2 "Two" m else (m, res)
else (m, res)
我重复多次:
let value, boolean = function application to value and other values in
if boolean then another function application to the new value and other values (not the same as the first one)
else the result
这意味着这些函数不一定具有相同的类型,但它们都返回一个a IM.t * bool
(a
对于每个函数来说是相同的类型)。
我想知道是否可能创建一个内联运算符让我这样做。
我尝试了类似以下的内容:
module EqMonad = struct
let ( let* ) (t, res) f2 = if res then f2 t else (t, false)
let return t = t
end
但明显这样不起作用,因为f2
需要接收t
作为最后一个参数,但它需要多个参数。
我想我可以这样总结我的问题:
是否有可能使用单子包装可变参数函数?
IM.mem
而是奇怪地使用IM.find
? - jthulhu