作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我到目前为止所得到的......
fun positive l1 = positive(l1,[],[])
| positive (l1, p, n) =
if hd(l1) < 0
then positive(tl(l1), p, n @ [hd(l1])
else if hd(l1) >= 0
then positive(tl(l1), p @ [hd(l1)], n)
else if null (h1(l1))
then p
最佳答案
你没有提到你的代码没有输入。
您的第一个函数子句只有变量 l1
,在递归中使用。然而在这里它被用作三元组的第一个元素,作为参数给出。这与 SML 使用的 Hindley-Milner 类型系统并不真正齐头并进。以下非正式想法可能会更好地说明这一点:
让我们先假设 l1
类型为 'a
,因此该函数必须接受该类型的参数并返回未知的'a -> ...
.然而,在右边你创建一个参数 (l1, [], [])
其类型必须为 'a * 'b list * 'c list
.但由于它作为参数传递给函数,这也意味着 'a
等于 'a * 'b list * 'c list
,显然不是这样。
显然这不是你的初衷。似乎您的意图是拥有一个以列表作为参数的函数,然后同时拥有一个递归辅助函数,该函数需要两个额外的累积参数,即原始列表中的正数和负数列表。
为此,您至少需要为您的辅助函数指定另一个名称,这样它的定义就不会重新绑定(bind)原始函数的定义。
然后你有一些选项,关于这个辅助函数应该在哪个范围内。一般来说,如果除了从“主”函数调用这个辅助函数没有任何意义,那么它不应该放在“主要”功能之外的范围。这可以使用这样的 let 绑定(bind)来完成:
fun positive xs =
let
fun positive' ys p n = ...
in
positive' xs [] []
end
positives'
不能在
positive
之外调用功能。
fun foo [] = ... (* input list is empty *)
| foo (x::xs) = ... (* x is now the head, and xs is the tail *)
@
)(始终可以),则不应使用它。fun foo [] acc = rev acc
| foo (x::xs) acc = foo xs (x::acc)
fun positive xs =
let
fun positive' [] p = rev p
| positive' (y::ys) p =
if y < 0 then
positive' ys p
else
positive' ys (y :: p)
in
positive' xs []
end
关于list - SML:如何将一个函数传递给一个列表并返回删除所有负实数的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14386055/
我是一名优秀的程序员,十分优秀!