- 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/
在 OCaml 中,函数应用程序的评估顺序是未指定的(又名非确定性的)。 在标准机器学习中,它也是非确定性的还是确定性的?您能否提供对规范部分进行澄清的引用? 编辑:对于那些稍后来的人,我还了解到,与
我是 SML 的新手,正在使用 SMLNJ 方言。 出于某种目的,我一直在尝试将 3 类型转换为 3.0(int 到 real)。 找不到出路。我怎样才能做到这一点?如何在类型之间进行转换? 最佳答案
SML中有标准的排序函数吗?互联网上的文档太少了,我找不到任何文档。 最佳答案 SML 基础库中没有定义排序功能,但大多数实现都扩展了基础库并添加了额外的功能。 因此,MosML 具有 ArraySo
1 fun max(a,b,c) = 2 if a > b a
SML长度函数: fun length(L) = if (L=nil) then 0 else 1+length(tl(L)); 例如: length [1,2,3] = 3; len
这里的第一个问题只是想作为我做了几个查询的序言,虽然我发现了多个措辞相似的问题,但我发现没有一个问题在问或回答我的问题(据我所知)。 我正在 SML 中进行类作业,因此我将省略一些细节,以便我可以自己
我正在使用带有 SML 模式的 Emacs。有时我需要清理 SML 缓冲区。我怎样才能做到这一点。 最佳答案 新泽西标准 ML 是一种函数式编程语言,它是 ML 的变体。通常它在带有插件的 EMACS
我相信我对在 SML 中捕获异常有一些基本的误解。 我写了下面的代码: fun my_g acc p = let val r = my_g acc in ca
我目前在 SML 代码中有很多打印语句,而且我正在遍历一个非常大的树,所以打印所有打印语句需要一段时间,但现在我不想看到任何打印语句和只是想看到它尽可能快地运行。但我不想评论所有的打印,因为我以后需要
我正在使用 SML/NJ,我需要使用某个文件中的一组函数 f1.sml在另一个文件中 f2.sml . 但是,我没有运行 f2.sml直接,相反,我从其他地方导入它。 如果我使用 use f2.sml
fun p( x::xl ) = if x::xl = [] then [] else [0]; 它收到警告:匹配非详尽无遗。 x::xl => ... 我想做的是: p( [] ) = []
我有这个声明: let val x = let val x = 5 in(fn y =>(y,x+y)) end in let val y=3 and z=
有没有办法使用 SML 打印完整列表? 通常在 SML 中发生的情况是,当我有太多元素时,它会打印由“,”分隔的前几个元素,然后用 ... 省略列表的其余部分,但我想看看完整列表。有什么办法吗? va
我正在尝试读取我的输入文件的名称 argv[1] 。这是我到目前为止所做的: val args = CommandLine.arguments() ; val (x::y) = args ; val
我如何转换 array输入 list输入 sml。我已经搜索了列表和数组结构函数,但没有找到执行此操作的函数(尽管有一个数组函数列表)。 列表结构说明: http://sml-family.org/B
我目前正在为 SML 类(class)的作业评分。我编写了一些测试用例来自动检查学生作业中函数的正确性,我希望能够导入他们的代码,然后针对该代码运行测试用例。我正在想象类似于 python 导入语义的
如何将命令行参数传递给 SML 脚本?我知道有一个 CommandLine.arguments()正确类型的函数( unit -> string list ),但像这样调用解释器: $ sml scr
假设我在 sml 中有一个非常大的列表,然后 sml 显示一些条目,然后开始显示 # 字符。 有人能告诉我如何查看整个列表吗? 最佳答案 假设这是 SML/NJ,您可以使用 printLength ,
我有以下公式 fun foo 0 = [0] | foo num = let val l = (num mod 2)::foo(num div 2) in rev l
我有一个关于我的作业的问题,问题是 有使用数据类型: datatype 'a llist = LList of 'a llist list| Elem of 'a; 嵌套列表由多态类型的元素或嵌套列表
我是一名优秀的程序员,十分优秀!