从F#中的列表中删除

时间:2018-09-07 05:46:48

标签: recursion f# functional-programming pattern-matching

我需要有关F#上的字符串连接的帮助。

给定一个整数n并列出l,我必须删除l中所有出现的n。例如:

 remove 1 (L(1, L(2, L(3, E)))) should give me L(2, L(3, E))

我的代码:

type ilist = E | L of int * ilist


let rec remove n l =
match l with
| E -> []
| L(h,E) -> if (h=n) then remove h (L(h,E))
            else [h, E]
| L(h,t) -> if (h=n) then remove h t
            else [h :: (remove n t)] 

我收到一个类型错误,说最后一行应该是类型     int * ilist
但是这里有类型     '列表

任何帮助将不胜感激!谢谢

1 个答案:

答案 0 :(得分:3)

主要问题是一个常见问题。您将结果包装在[]中,而忘记了h :: remove n t已经是一个列表。所以我的固定版本:

let rec remove n l =
  match l with
    | E -> []
    | L(h,t) -> if (h = n) then remove n t
                           else h :: (remove n t)

请注意,您可以摆脱中间情况,因为可以通过将tE匹配来很好地解决此问题。

我还将您的remove h更改为remove n;即使可以保证它们相等,但我认为n会更好 是递归函数的“常量”参数。