我正在尝试在标准ML中编写一个尾递归函数来查找列表的长度;因此,例如,len([1,2,3,4,5])
应为5
。
我能够在Scheme中解决这个问题:
(define (len1 lis sofar)
(if
(null? lis) sofar
(len1 (cdr lis) (+ sofar 1))))
(define (len lis)
(len1 lis 0))
(len (list 2 3 4 5 6 7)) = 6
但我似乎无法在SML中获得它。以下是我到目前为止的情况:
fun len [] = raise Fail "len: empty list"
| len [x] = (x,x)
| len (x::xs) =
或
len1([]:list, curLen:int) = []null? then curLen | len1(tl[], curLen+1);
len([]) = len1([], 0);
答案 0 :(得分:1)
在标准ML中,您可以使用模式匹配而不是显式null?
检查。
fun length lst = let
fun recur [] acc = acc
(* we don't care about the value of the element *)
| recur (_::rest) acc = recur rest (1 + acc)
in recur lst 0
end
在REPL中试用它可以得到预期的结果。
Standard ML of New Jersey v110.76 [built: Thu Feb 19 00:37:13 2015]
- fun length lst = let
fun recur [] acc = acc
(* we don't care about the value of the element *)
| recur (_::rest) acc = recur rest (1 + acc)
in recur lst 0
end ;;
- length [] ;;
= val it = 0 : int
- length [1, 2, 3] ;;
= val it = 3 : int
-
顺便提一下,与OP的评论者一致。你在Scheme中管理得很好,这意味着你可能在使用SML语法方面遇到了一些麻烦。我建议the appropriate Learn X in Y page。