SML尾递归长度列表函数

时间:2015-03-16 07:30:28

标签: list sml tail-recursion ml

我正在尝试在标准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);

1 个答案:

答案 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