SML中的过滤函数

Filter function in SML

我使用这个函数来过滤整数列表。我在 SML 中开始,我不知道错误在哪里。

fun filter f = fn [] => []
| fn (x::xs) => if f(x)
then x::(filter f xs) else (filter f xs)

fun g(x) = if x>5 then true else false

val listTest = filter g [1, 2, 4, 6, 8, 10] 

谢谢!

你的第二个fn是多余的,请删除:

fun filter f = fn [] => []
| (x::xs) => if f(x)
then x::(filter f xs) else (filter f xs)

然后就可以愉快的编译了:

- use "a.sml";
[opening a.sml]
val filter = fn : ('a -> bool) -> 'a list -> 'a list
val g = fn : int -> bool
val listTest = [6,8,10] : int list
val it = () : unit

顺便说一句,fun g(x) = if x>5 then true else false 不是很好的风格。 fun g x = x > 5更好

带有 fn 的定义看起来像带有 fun 的定义,但没有名称和箭头而不是 =:

fn a0 => e0
 | a1 => e1
 | ...

这是正确的:

fun filter f = fn [] => []
                | (x::xs) => if f(x)
                             then x::(filter f xs) 
                             else (filter f xs)

但常见的形式是

fun filter _ [] = []
  | filter f (x::xs) = if f x
                       then x :: filter f xs
                       else filter f xs

fun g x = x > 5