【问题标题】:foldr/foldl with logic operators in SMLfoldr/foldl 与 SML 中的逻辑运算符
【发布时间】:2017-01-25 01:39:16
【问题描述】:

我正在尝试使用foldrfoldl 在SML 中构建一个函数,它将返回列表中所有元素的逻辑或逻辑和。

我尝试过这种方式,使用 andor

fun band x = foldr (op and) true x;
fun bor x = foldr (op or) false x;

并且还使用 andalsoorelse。但我不断收到错误消息,例如:

Error: unbound variable or constructor: or

【问题讨论】:

    标签: functional-programming sml fold ml


    【解决方案1】:

    我发现了问题:andalsoorelse 既不是运算符也不是函数,因为它们实现了short-circuit evaluation

    因此,解决方案应该是:

    fun band x = foldl (fn (a,b) => a andalso b) true x;
    fun bor x = foldr (fn (a,b) => a orelse b) false x;
    

    【讨论】:

    • 这并不能解释为什么 andor 不起作用。 andor 不要使用短路评估,所以你的第一个代码不应该工作吗?免责声明:我不了解 SML,但我开始阅读有关您的问题的信息。我只想知道区别^_^
    • @naomik: andor 甚至都不是运算符。 and 是一个关键字,用于将相互依赖的声明链接在一起,例如值声明,如相互递归函数或类型声明。 IE。 and 不对值进行操作。例如看问题what is a mutually recursive type?
    • @JéssicaCarneiro:考虑使用List.all (fn x => x)List.any (fn x => x),因为与List.foldl 不同,它们也是短路的。在band 的情况下折叠比第一个false / 在bor 的情况下true 折叠更远真的没有意义。
    • @SimonShine 我不确定我是否理解。你的意思是:fun band x = List.all(fn (a,b) => a andalso b) x; ?
    【解决方案2】:

    (回答而不是评论。)考虑使用List.all : ('a -> bool) -> 'a list -> boolList.exists : ('a -> bool) -> 'a list -> bool,因为它们是短路的,不像List.foldl。在band 的情况下,折叠得比第一个falsebor 的情况下的true 折叠得更远真的没有意义。也就是说,

    val band = List.all (fn b => b)
    val bor = List.exists (fn b => b)
    

    找到这些库函数的一个定义here

    fun all p []      = true
      | all p (x::xr) = p x andalso all p xr;
    
    fun exists p []      = false
      | exists p (x::xr) = p x orelse exists p xr;
    

    由于提供给bandbor 的列表已经是bool 类型,传递标识函数(fn b => b) 将产生所需的真值。这些函数足够通用,可以处理任何类型的列表,您可以为每个元素应用谓词,因此如果您从其他列表生成bool list,则可以避免该步骤。

    【讨论】:

    • 我对所有答案都投了赞成票,因为它们都很好,但这一个显然是最好的,正是因为List.allList.exists 短路而List.foldl 没有。
    • 这种方式更简洁,我想我可以说它也更有效,因为它是短路的。谢谢!
    【解决方案3】:

    在 SML 中没有称为 andor 的运算符。 and 是一个关键字,用于分隔同时声明的多个变量或声明。没有or

    AND 和 OR 逻辑运算符是 andalsoorelse,正如您在自己的回答中所说,它们是短路的,而不是常规运算符。

    【讨论】:

      猜你喜欢
      • 2010-09-27
      • 2021-02-07
      • 2014-07-07
      • 1970-01-01
      • 2014-04-17
      • 2016-07-18
      • 2011-08-28
      • 2015-01-08
      相关资源
      最近更新 更多