我刚开始使用标准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]
答案 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