【问题标题】:High order SML questions高阶 SML 问题
【发布时间】:2021-12-24 09:15:40
【问题描述】:

因此,我正在尝试创建一个高阶 SML 函数,该函数接受一个数字并返回所有函数并返回其因子。我已经完成了一些问题,我会获取一个值列表并返回可整除的值,但我从来没有做过任何事情,比如取一个数字并从中列出一个列表。跟随问题:

定义一个函数factorize = fn: int -> int list,它接受一个整数并在一个列表中返回它的所有因子。例如,factorize 12 将返回 [1, 2, 3, 4, 6, 12]

第二个比较棘手,我不明白它是怎么做到的,所以把它放在这里。如果我能在这方面获得任何帮助,我将不胜感激。

定义一个函数cfoldl,其行为与标准foldl完全相同,只是函数参数的类型不采用2元组',输入函数应使用柯里化符号’a -> ’b -> ’b .因此,cfoldl 的类型应该是fn : (’a -> b -> ’b) -> ’b -> ’a list -> ’b。例如,cfoldl (fn a => fn b => a-b) 1 [1,2,3,4]; 将返回 3

我为foldl制作了这个:

fun cfoldl f b [] = b
  | cfoldl f b (x::xs) = cfoldl f (f (x, b)) xs;

谢谢!

【问题讨论】:

  • 您可能会发现编写函数curry 很有用。例如,使用fun curry f a b = f (a, b),您可以编写curry op+,并获得加法运算符的柯里化版本。

标签: sml higher-order-functions


【解决方案1】:

factorize = fn: int -> int list 接受一个整数并在列表中返回其所有因子

这是一个递归函数,它接受一个数字并生成一个从 1 到该数字的数字列表:

fun upto n =
    let fun go i = if i < n
                   then i :: go (i+1)
                   else []
    in go 1
    end

xy 的一个因子时,您能否创建一个函数isFactor x y 为真?

如果你有这样的功能,你能不能修改上面的功能来使用它?

一个函数 cfoldl 应该像 ’a -&gt; ’b -&gt; ’b 一样使用柯里化符号

fun cfoldl f b [] = b | cfoldl f b (x::xs) = cfoldl f (f (x, b)) xs;

这正是foldl

fun foldl f e []      = e
  | foldl f e (x::xr) = foldl f (f(x, e)) xr;

这里,f : ('a * 'b) -&gt; 'b 因为f 被用作f(x, e),所以它自然会假设一个元组。您可以通过不同的方式更改f 的推断类型。

你能想到f : 'a -&gt; 'b -&gt; 'b的方法吗?

【讨论】:

  • 是的,我找到了获取 f 的方法:'a -> 'b -> 'b。有趣的 cfoldl f b [] = b | cfoldl f b (x::T) = cfoldl f (f x b) T;
  • 对于第5个问题,我无法解决从1到i的问题,所以我从i到1.fun factorize n = let fun num 0 = [] fun num x = if( x mod n = 0) 然后 n :: num(x-1) else num(n-1) in num n end;这是我的 5 号代码。感谢您的提示,这很有帮助。
猜你喜欢
  • 1970-01-01
  • 2013-01-16
  • 2013-03-20
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 2014-04-06
  • 2022-01-06
  • 1970-01-01
相关资源
最近更新 更多