-
А если так, то, жуйк, ШТО должно значить выделенное жирным запись в след. коде:
myFoldl f z xs = foldr step id xs z
where step x g a = g (f a x)
foldr — функция от трех аргументов, а мы вызываем её от 4-х:
step, id, xs, z
ЧЗХ?
Replies (38)
-
@lexszero, Я тоже так это понимаю, но ЧТО это должно значить? foldr вернет нам некое число или строку — скаляр, короче, а мы возьмем и РЯДОМ НАПИШЕМ НУЛИК? Так что ли?
Правда, я ничего не понимаю.
Но ещё больше меня смущает сигнатура foldl:
foldl :: (a -> b -> a) -> a -> [b] -> a
Принимает три аргумента, и возвращает 3 значения, так? Но оно же возвращает цифру или строку, или там список ._. -
@folex, функции всегда принимают один аргумент. всегда. и возвращают всегда тоже один. тип функции — это всегда dom -> cod
можно рассматривать сигнатуру foldl как-то так: (a -> b -> a) -> (a -> ([b] -> a)); dom ~ (a -> b -> a) (т.е. аргумент — функция), cod ~ (a -> ([b] -> a)) (т.е. возвращаемое значение — тоже функция) -
@folex, касательно исходного вопроса — смотри:
Prelude> let step x y z = y ((*) z x)
Prelude> :t step
step :: Num a => a -> (a -> t) -> (a -> t)
Prelude> :t foldr
foldr :: (a -> b -> b) -> b -> [a] -> b
Prelude> :t foldr step
foldr step :: Num a => (a -> t) -> [a] -> (a -> t)
Prelude> :t foldr step id
foldr step id :: Num t => [t] -> t -> t
Prelude> :t foldr step id [1, 2, 3]
foldr step id [1, 2, 3] :: Num t => t -> t
Prelude> :t foldr step id [1, 2, 3] 1
foldr step id [1, 2, 3] 0 :: Num t => t
Prelude> foldr step id [1, 2, 3] 1
6
я там немного скобочек дорасставлял, чтобы понятней было,- какой тип куда подставляется. надеюсь, поможет/22 · Reply