插入函数中的 SML 未绑定值标识符错误
SML Unbound value identifier Error in Insert Function
我的单独功能有问题。分隔 returns 一个列表,该列表在列表 l 的每个 k 元素之后插入元素 x(从
列表的末尾)。例如,分隔 (1, 0, [1,2,3,4]) 应该 return [1,0,2,0,3,0,4] 并且分隔 (3, 0, [1, 2,3,4]) 应该 return [1,0,2,3,4]。每当我 运行 对其进行任何测试时,我都会收到错误消息:
! Unbound value identifier: separate
这是我正在使用的代码:
(*Function returns length of lst *)
fun length(lst: int list): int =
case lst of
[] => 0
| h::t => 1 + length(t)
(*Insert element x at the kth position in the list
and return the new list*)
fun kinsert [] x k = [x]
| kinsert ls x 0 = x::ls
| kinsert (l::ls) x k = l::(kinsert ls x (k - 1))
(* c: keeps track of where we are in the list
n: determines if we insert element at given position
z: holds length of the list *)
fun sep_help k x l c n z=
if c = z then l
else if n = k then (sep_help k x (kinsert l x c) (c+2) 0 z )
else (sep_help k x l (c+2) (n+1) z) ;
(*Returns list l with x inserted after each k element *)
fun separate (k: int, x: 'a, l: 'a list) : 'a list =
| separate k x l = (sep_help k x l 0 0 (length l));
任何人都知道可能导致错误的原因是什么?
您的 separate
看起来像是两个不同定义的合并 - 首先是没有定义的未柯里化版本,然后是有定义的柯里化版本。
你的意思可能是
fun separate (k: int, x: 'a, l: 'a list) : 'a list = sep_help k x l 0 0 (length l);
但是通过列表向后工作会使事情变得相当复杂。
从头到尾,前后颠倒列表就容易多了。
然后 "all" 你需要的是一个帮助程序,它在列表中的每个 k:th 位置插入一个元素。
可能是这样的:
(*Returns list l with x inserted after each k element *)
fun separate (k: int, x: 'a, l: 'a list) : 'a list =
let
fun kinsert [] _ = []
| kinsert ls 0 = x::(kinsert ls k)
| kinsert (l::ls) i = l::(kinsert ls (i-1))
in
List.rev (kinsert (List.rev l) k)
end
我的单独功能有问题。分隔 returns 一个列表,该列表在列表 l 的每个 k 元素之后插入元素 x(从 列表的末尾)。例如,分隔 (1, 0, [1,2,3,4]) 应该 return [1,0,2,0,3,0,4] 并且分隔 (3, 0, [1, 2,3,4]) 应该 return [1,0,2,3,4]。每当我 运行 对其进行任何测试时,我都会收到错误消息:
! Unbound value identifier: separate
这是我正在使用的代码:
(*Function returns length of lst *)
fun length(lst: int list): int =
case lst of
[] => 0
| h::t => 1 + length(t)
(*Insert element x at the kth position in the list
and return the new list*)
fun kinsert [] x k = [x]
| kinsert ls x 0 = x::ls
| kinsert (l::ls) x k = l::(kinsert ls x (k - 1))
(* c: keeps track of where we are in the list
n: determines if we insert element at given position
z: holds length of the list *)
fun sep_help k x l c n z=
if c = z then l
else if n = k then (sep_help k x (kinsert l x c) (c+2) 0 z )
else (sep_help k x l (c+2) (n+1) z) ;
(*Returns list l with x inserted after each k element *)
fun separate (k: int, x: 'a, l: 'a list) : 'a list =
| separate k x l = (sep_help k x l 0 0 (length l));
任何人都知道可能导致错误的原因是什么?
您的 separate
看起来像是两个不同定义的合并 - 首先是没有定义的未柯里化版本,然后是有定义的柯里化版本。
你的意思可能是
fun separate (k: int, x: 'a, l: 'a list) : 'a list = sep_help k x l 0 0 (length l);
但是通过列表向后工作会使事情变得相当复杂。
从头到尾,前后颠倒列表就容易多了。
然后 "all" 你需要的是一个帮助程序,它在列表中的每个 k:th 位置插入一个元素。
可能是这样的:
(*Returns list l with x inserted after each k element *)
fun separate (k: int, x: 'a, l: 'a list) : 'a list =
let
fun kinsert [] _ = []
| kinsert ls 0 = x::(kinsert ls k)
| kinsert (l::ls) i = l::(kinsert ls (i-1))
in
List.rev (kinsert (List.rev l) k)
end