SML:遍历列表以获取所有其他值的最佳方法是什么?
SML: What would be the best way to go through a list to take every other value?
我最近在 sml 中做了很多练习,我在课本中发现的一个问题是要求创建一个函数,将函数应用于列表中的奇数索引值。当试图解决这个问题时,我真的不明白如何获得其他所有价值。例如
fun something f [] = 0
| something f (x:xs) =
在上面我知道我们可以通过 x 值按顺序获取值,但是现在有没有办法应用它来只获取奇数索引值?对不起,如果这是一个简单的问题,sml 是一种有趣但令人困惑的语言。
在那种情况下,您也可以 "destructure" 具有模式匹配的列表 – 模式可以任意复杂。
例如,a::b::bs
匹配至少包含两个元素的列表,a::b::c::bs
至少包含三个元素,依此类推。
如果我们索引第一个元素1:
fun everyOther _ [] = []
| everyOther f [x] = [f x]
| everyOther f (x::y::xs) = (f x)::y::(everyOther f xs)
测试:
val everyOther = fn : ('a -> 'a) -> 'a list -> 'a list
val it = () : unit
- fun square x = x * x;
val square = fn : int -> int
- everyOther square [1,2,3,4];
val it = [1,2,9,4] : int list
- everyOther square [1,2,3,4,5];
val it = [1,2,9,4,25] : int list
第一个元素被索引为 0 而不是 1 的情况留作练习。
我最近在 sml 中做了很多练习,我在课本中发现的一个问题是要求创建一个函数,将函数应用于列表中的奇数索引值。当试图解决这个问题时,我真的不明白如何获得其他所有价值。例如
fun something f [] = 0
| something f (x:xs) =
在上面我知道我们可以通过 x 值按顺序获取值,但是现在有没有办法应用它来只获取奇数索引值?对不起,如果这是一个简单的问题,sml 是一种有趣但令人困惑的语言。
在那种情况下,您也可以 "destructure" 具有模式匹配的列表 – 模式可以任意复杂。
例如,a::b::bs
匹配至少包含两个元素的列表,a::b::c::bs
至少包含三个元素,依此类推。
如果我们索引第一个元素1:
fun everyOther _ [] = []
| everyOther f [x] = [f x]
| everyOther f (x::y::xs) = (f x)::y::(everyOther f xs)
测试:
val everyOther = fn : ('a -> 'a) -> 'a list -> 'a list
val it = () : unit
- fun square x = x * x;
val square = fn : int -> int
- everyOther square [1,2,3,4];
val it = [1,2,9,4] : int list
- everyOther square [1,2,3,4,5];
val it = [1,2,9,4,25] : int list
第一个元素被索引为 0 而不是 1 的情况留作练习。