如何缩短标准ml中的列表

时间:2014-10-27 05:10:54

标签: list sml smlnj

我刚开始使用标准ml,并且在理解这种语言的列表时遇到了一些麻烦。所以我的问题是如何缩短ml列表?例如,如果我有一个列表[1,2,3,4,5,6],我想将其缩短为[1,2]。到目前为止我所拥有的是:

fun shorten(i, l) = let val newlen = i in newlen = length l//in correct

我想要的是一个函数,它将i作为用户想要缩短列表的位置,l是列表。在这种情况下,输入应该看起来像shorten(2, [1,2,3,4,5,6],输出应该看起来像[1,2]

2 个答案:

答案 0 :(得分:1)

此功能应该这样做:

fun shorten(_, nil) = nil
  | shorten(0, _) = nil
  | shorten(i, x::xs) = x::shorten(i - 1, xs)

正如您所注意到的,当i大于列表的长度时,此函数不会抛出任何异常。使用异常的方法是:

exception IllegalArgument

fun shorten(_, nil) = nil
  | shorten(0, _) = nil
  | shorten(i, x::xs) =
    if i > length(x::xs) then raise IllegalArgument
    else x::shorten(i - 1, xs)

在SML中,您需要在使用exception引发之前使用raise声明任何异常类型。否则,异常类型不会在环境中绑定,并且解释器会抱怨该符号未知。

答案 1 :(得分:1)

SML Basis Library包含函数List.take,可以在List Structure中执行所需的任务。

- fun shorten ( toHowMany, myList ) =  List.take ( myList, toHowMany ) ;
val shorten = fn : int * 'a list -> 'a list

- shorten ( 2, [1,2,3,4,5,6] ) ;
val it = [1,2] : int list

如果参数的顺序无关紧要,则List.take可以直接使用:

- List.take ( [1,2,3,4], 2 ) ;
val it = [1,2] : int list