Упражнение 1 на странице 102 Викибука по Haskell предлагает: «Напишите собственное определение scanr, сначала используя рекурсию, а затем используя foldr». Я написал рекурсивный:
myscan f acc [] = [acc]
myscan f acc (x:xs) = val : rest where
val = f x (head rest)
rest = myscan f acc xs
... но не смог определить версию папки. В конце концов я погуглил и нашел этот ответ:
myscan2 f acc xs = foldr f' [acc] xs where
f' x xs = (f x (head xs)) : xs
Очевидно, что это работает, но для меня это не имеет смысла. Использование параметров
(+) 0 [1,2,3]
... становится примерно так:
myscan2 (+) 0 [1,2,3] = foldr f' [0] [1,2,3] where
f' [0] [1,2,3] = ((+) [0] (head [1,2,3])) : [1,2,3]
... но часть ((+) [0] (head [1,2,3])) не совместима по типу с (+). Тем не менее, функция работает, так что я неправильно читаю или конвертирую?
((+) 3 (head [0])) : [0]
. Аккумулятор является вторым входом в функциюfoldr
, но по какой-то безумной причине они называют аргумент аккумулятораxs
. - person genisage   schedule 22.02.2015