OCaml错误过滤器列表使用更高阶函数

时间:2015-07-04 16:38:56

标签: list function types filter ocaml

所以我做了这个练习:

filter (fun x -> x = 0) [(1,0);(2,1);(3,0);(4,1)];;
result int list [1;3]

所以基本上你必须将你的x in fun与列表中的第二个数字相匹配,如果你的相同,你就用第一个数字创建新的列表。

我的解决方案但错了

   let rec filter f = function
   | []->[]
   | x::l -> if f=snd x then fst x :: filter f l else [];;

当我想尝试代码时出现以下错误:

  

错误:此表达式的类型为int,但需要表达式   类型            int -> bool

3 个答案:

答案 0 :(得分:0)

我无法重现您报告的问题。这是我在尝试代码时看到的内容:

(+5) :: Num a => a -> a

没有错误,但它得到了错误的答案。这就是我期望看到你的代码。

答案 1 :(得分:0)

你得到的错误是说编译器正在某个地方期待int -> bool函数,但你给它一个int。您收到此错误的原因是您具有相等性(f = snd x),其中f的类型为int -> bool,而snd x的类型为int。给予平等的两个参数必须是相同的类型。相反,您想要做的只是简单地将f应用于x的第二个元素,例如:

let rec filter f = function
  | []->[]
  | x::l -> if f (snd x) then fst x :: filter f l else [];;

那就是说,我建议使用模式匹配而不是fstsnd,例如:

 let rec filter f l = 
     match l with
         | [] -> []
         | (x,y)::l -> if f y then x :: filter f l else filter f l

请注意f y将返回类型为bool的内容,然后将确定要采用的分支。

答案 2 :(得分:0)

Altough Matts的回答是正确的。重用现有功能而不是从头开始编写特殊功能是很好的:

[(1,0);(2,1);(3,0);(4,1)]
|> List.filter (fun (_, x) -> x = 0)
|> List.map fst