SML:通过列表获取其他所有值的最佳方法是什么?

问题描述 投票:3回答:1

我最近在sml中做了很多练习,我在教科书中发现的一个问题是要求创建一个函数,将函数应用于列表中的奇数索引值。当试图解决这个问题时,我并不真正理解如何获得其他所有价值。例如

fun something f [] = 0
    | something f (x:xs) = 

在上面我知道我们可以通过x值按顺序获取值,但现在有一种方法可以应用它来获得奇数索引值吗?很抱歉,如果这是一个简单的问题,sml一直是一个有趣但令人困惑的语言。

list sml ml mosml
1个回答
2
投票

在这种情况下,您也可以使用模式匹配来“解构”列表 - 模式可以是任意复杂的。 例如,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的情况作为练习。

© www.soinside.com 2019 - 2024. All rights reserved.