小编Ale*_*der的帖子

相互递归函数中的尾递归

我有以下代码:

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)

recursion f# f#-interactive

4
推荐指数
1
解决办法
259
查看次数

在地图上映射<'a,int>

我有以下类型:

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)

当我想要第一个提到的函数签名时,我的实现有什么问题?

f# f#-interactive

3
推荐指数
1
解决办法
88
查看次数

减去两个Map <'a,int>的地图

我有以下类型:

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)

f# f#-interactive

2
推荐指数
1
解决办法
147
查看次数

标签 统计

f# ×3

f#-interactive ×3

recursion ×1