SML: Каков наилучший способ просмотреть список, чтобы получить все остальные значения?
В последнее время я много практиковался в sml, и одна проблема, которую я обнаружил в своем учебнике, заключалась в том, чтобы попросить создать функцию, которая применяет функцию к нечетным индексированным значениям в списке. Когда я пытаюсь решить эту проблему, я не понимаю, как получить любую другую ценность. например
fun something f [] = 0
| something f (x:xs) =
Здесь выше я знаю, что мы можем получить значения по порядку через значение x, но есть ли способ теперь применить это, чтобы получить только нечетные индексированные значения? Извините, если это простой вопрос, sml был интересным, но запутанным языком.
1 ответ
В этом случае вы также можете "деструктурировать" список с помощью сопоставления с образцом - шаблоны могут быть произвольно сложными.
Например, 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, оставлен в качестве упражнения.