我有这个功能
fun exist p M = foldr( fn(x,y) => x orelse y ) false (map p M)
我只需要使用 foldr 函数编写它,但只能调用 foldr 一次。我很困惑我应该如何处理这个问题。我需要修改我的匿名功能吗?
我有这个功能
fun exist p M = foldr( fn(x,y) => x orelse y ) false (map p M)
我只需要使用 foldr 函数编写它,但只能调用 foldr 一次。我很困惑我应该如何处理这个问题。我需要修改我的匿名功能吗?
是的,您需要修改匿名函数。你可以p
在里面打电话。
fun exist p M = foldr (fn (x, y) => y orelse (p x)) false M
map
在您的代码中将值转换为bool
类型。您可以在匿名函数中执行此操作。此外,切换x
和y
输入orelse
将为您节省一些机器时间,因为如果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 个参数
(x, y)
,其中x
是列表中的当前值,y
- 值列表已折叠到目前为止。y
与列表的最后一个值一起传递给第一个参数函数。x
。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