所以我做了这个练习:
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
答案 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 [];;
那就是说,我建议使用模式匹配而不是fst
和snd
,例如:
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