我有以下代码:
let rec f n =
if n < 10 then "f" + g (n+1) else "f"
and g n =
if n < 10 then "g" + f (n+1) else "g"
Run Code Online (Sandbox Code Playgroud)
我想使这些相互递归的函数尾递归以进行优化.我尝试过以下方法:
let rec fT n =
let rec loop a =
if n < 10 then "f" + gT (a) else "f"
loop (n + 1)
and gT n =
let rec loop a =
if n < 10 then "g" + fT (a) else "g"
loop (n …Run Code Online (Sandbox Code Playgroud) 我有以下类型:
type MultiSet<'a when 'a: comparison> = MSet of Map<'a, int>
Run Code Online (Sandbox Code Playgroud)
我现在想要使用签名声明此类型的af map函数:
('a -> 'b) -> Multiset<'a> -> Multiset<'b> when 'a : comparison and 'b : comparison
Run Code Online (Sandbox Code Playgroud)
我试过了 :
let map m ms =
match ms with
| MSet s -> MSet ( Map.map (fun key value -> m key) s )
Run Code Online (Sandbox Code Playgroud)
但它有签名:
('a -> int) -> Multiset<'a> -> Multiset<'a> when 'a : comparison
Run Code Online (Sandbox Code Playgroud)
当我想要第一个提到的函数签名时,我的实现有什么问题?
我有以下类型:
type Multiset<'a when 'a: comparison> = MSet of Map<'a, int>
Run Code Online (Sandbox Code Playgroud)
我想为这种类型声明一个减去两个MSets的函数.
假设我有以下两个Multisets:
let f = MSet (Map.ofList [("a",1);("b",2);("c",1)])
let g = MSet (Map.ofList [("a",1);("b",3);("c",1)])
Run Code Online (Sandbox Code Playgroud)
我现在尝试创建这个带有两个Multisets的减法函数.
let subtract fms sms =
match fms with
| MSet fs -> match sms with
| MSet ss ->
let toList ms = Map.fold (fun keys key value -> keys @ [for i = 1 to value do yield key] ) [] ms
let fromList l = match l with
| [] -> MSet(Map.ofList …Run Code Online (Sandbox Code Playgroud)