使用foldr简化函数(SML / NJ)

时间:2013-10-03 19:27:57

标签: functional-programming sml smlnj fold

我有这个功能

fun exist p M = foldr( fn(x,y) => x orelse y ) false (map p M)

我只需要使用foldr函数编写它,但只能调用foldr一次。我对如何处理这件事很困惑。我需要修改我的功能吗?

1 个答案:

答案 0 :(得分:3)

是的,您需要修改您的匿名功能。您可以在其中拨打p

fun exist p M = foldr (fn (x, y) => y orelse (p x)) false M
代码中的

map会将值转换为bool类型。您可以在匿名函数中执行此操作。此外,在x中切换yorelse可以节省一些机器时间,因为如果找到满足p的值,则p不会成为在M的其余部分执行。

- fun exist p M = foldr (fn (x, y) => y orelse (p x)) false M;
val exist = fn : ('a -> bool) -> 'a list -> bool
- exist (fn e => e = 1) [2,3,4];
val it = false : bool
- exist (fn e => e = 1) [2,3,4,1,2,3,4];
val it = true : bool

foldr需要3个参数

  1. 折叠列表的功能。它需要元组参数(x, y),其中x是列表中的当前值,y - 值列表已折叠到目前为止。
  2. 起始价值。它将作为y传递给第一个第一个参数函数以及列表的最后一个值。
  3. 列表折叠。此列表的每个值(从最后开始)将作为x传递给第一个参数函数。
  4. foldr将为传递列表的每个元素调用折叠函数。

    调用anon调用折叠(此处称为exist (fn e => e = 1) [2,1,4];)函数:

    anon (4, false);                              // here `false` is the false passed to `foldr`; returns false
    anon (1, false orelse (p 4));                 // (p 1) -> true; returns true
    anon (2, (false orelse (p 4)) orelse (p 1));  // returns true becuase `true or (p 2)` is true