【问题标题】:SML/NJ return even integers from int list with foldrSML/NJ 从带有 foldr 的 int 列表中返回偶数
【发布时间】:2016-02-01 03:35:39
【问题描述】:

我最近在使用 SML,我正在尝试解决一个问题。 我应该创建一个接受 int 列表并返回甚至 int 列表的函数, 我已经创建了它:

 fun evens [] = [] |
 evens [x] = [x] |
 evens(x::xs) =
 case x mod 2 of
 0 => x::evens xs |
 1 => evens xs;

这给出了正确的结果,但我需要使用foldr 这就是我想出的:

fun evens [] = [] |
evens(x::xs) =
case x mod 2 of
0 => foldr (op ::) evens xs [x]  |
1 => evens xs;

但它不起作用,我仍然对在这种情况下如何使用 foldr 感到困惑。

有什么建议吗?

【问题讨论】:

    标签: list int sml fold smlnj


    【解决方案1】:

    首先,使用foldr,您应该寻找单行定义,而不是使用模式和案例的递归定义。 foldr 的重点在于它包含了一个常见的递归模式——您只需要使用该模式即可。

    foldr的类型是

    fn : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b
    

    在您的情况下,'bint list'aintfoldr 的类型中间的箭头之间的'b 是种子值。它通常对应于基值。当您构建列表时,此基础值通常为[]。因此——您需要专注于 what 应该被折叠在列表中的关键问题。换句话说——你应该将什么类型的('a * 'b -> 'b) 函数传递给foldr?在您的情况下,您需要传递

    类型的函数
    int * int list -> int list
    

    this 应该是一个函数,当给定一个 int 和一个 int 列表时,要么将 int 附加到列表上(如果它是偶数的话),要么不理会列表。您可以提前定义此函数,使用let 定义它,或者只使用匿名函数。

    假设这是作业,我不想给出完整的答案,但这里有一个函数,它使用foldr 来获取列表中的肯定条目:

    fun positives xs =
        foldr (fn (x,xs) => if x >= 0 then x::xs else xs) [] xs;
    -
    - positives [3,~2,4,5,0,~1,~1,5];
    val it = [3,4,5,0,5] : int list
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-28
      • 2016-02-02
      • 2016-08-30
      • 2013-09-18
      • 1970-01-01
      • 2023-03-18
      • 2018-03-19
      • 1970-01-01
      相关资源
      最近更新 更多