- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 sml 的新手。我试图将 int 转换为 int 列表。例如,假设有一个输入1234,那么输出就是一个类似[1,2,3,4]的列表。我的问题是,如何在 sml 中键入嵌套函数?让到底?这是我的代码。
fun digit (a : int): int =
let
fun size (a) = if a < 0 then nil
else x = Int.toString x then digit s = size(x)
fun insert (num, nil) = [num]
| insert (num,xs) = x :: insert ()
fun convert (a, s) = if s < 0 then nil
else insert (a / (10*(s - 1)), xs)
then convert(a - (10*(s - 1), s - 1)
in
end
最佳答案
嵌套函数只是将工作负载拆分为多个较小部分的一种方法。另一种选择是非嵌套库函数。主要区别在于,未嵌套的函数不会继承其父级的变量范围,因此它们只能使用自己的输入,而嵌套的函数在其他任何地方都不可用,也不能重复使用。假设您要先解决这个问题:
fun digit_meh n = if n < 10 then [n] else n mod 10 :: digit_meh (n div 10)
然后您意识到它并没有完全按照您的意愿进行:
- digit_meh 1234;
> val it = [4, 3, 2, 1] : int list
您可以先删除最高有效位,但计算并不像 n mod 10
那样简单,因为它取决于位数。
您可以生成此列表然后反转它:
fun digit n = rev (digit_meh n)
但是函数 digit_meh
在这个函数之外并不是特别有用,所以可以使用 local-in-end 或 let-in- 隐藏它结束:
local
fun digit_meh n = if n < 10 then [n] else n mod 10 :: digit_meh (n div 10)
in
val digit = rev o digit_meh
end
fun digit n =
let fun meh n = if n < 10 then [n] else n mod 10 :: meh (n div 10)
in rev (meh n) end
请注意函数 meh
的 n
副本隐藏了 digit
的 n
副本。
为了清楚起见,您还可以用不同的方式命名变量。
或者您可以查看 rev
是如何做它的事情,然后去做。它基本上将其输入视为一个堆栈,并递归地将顶部元素放入新堆栈中,以便顶部成为底部,很像 StackOverflow 的 Logo ,如果它跳出并像 slinky spring 一样倒挂着地。 :
fun rev L =
let fun rev_stack [] result = result
| rev_stack (x::xs) result = rev_stack xs (x::result)
in rev_stack L [] end
因为结果是在一个额外的参数中累积的,而 rev
应该只接受一个参数,所以嵌套一个带有额外累积参数的函数是一个非常有用的技巧。
您也可以模仿这种行为:
fun digit N =
let fun digit_stack n result =
if n < 10
then n::result
else digit_stack (n div 10) (n mod 10::result)
in f N [] end
这样,我们继续首先处理最低有效位,但我们将它放在堆栈 result
中,这意味着它最终位于底部/末尾。所以我们不需要调用 rev
并保存列表的迭代。
实际上,您不必使用local-in-end 或let-in-end 来隐藏辅助函数;虽然在 let-in-end 的情况下继承父函数的作用域可能很有用,但一旦您开始使用带 opaque signatures 的模块,就没有必要隐藏您的函数。 (:>
运算符):
signature DIGIT =
sig
val digit : int -> int list
end
structure Digit :> DIGIT =
struct
fun digit_stack n result =
if n < 10
then n::result
else digit_stack (n div 10) (n mod 10::result)
fun digit n = digit_stack n []
end
由于这是输入到 REPL 中,只有相关函数在模块外可用:
> structure Digit : {val digit : int -> int list}
signature DIGIT = {val digit : int -> int list}
- Digit.digit 1234;
> val it = [1, 2, 3, 4] : int list
关于sml - 在标准 ml 中定义嵌套函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49292380/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!