Я объясню, почему ваш код не работает.Давайте вычислим pipe [g,h] x
.Мы ожидаем, что это будет g(h x)
.
. Я буду игнорировать типы и просто вычислять в соответствии с определениями:
pipe [g,h] x
= foldl' f base [g,h] x
= foldl' f (f base g) [h] x
= foldl' f (f (f base g) h) [] x
= f (f base g) h x
= (f base g) h x
= base g h x
= g h x
Итак, в последней строке мы видим, что g
вызывается с двумя аргументами h
и x
, в то время как мы ожидали получить g (h x)
.
Ошибка в том, что f
использует приложение f a x = a x
вместо композиции f a x = a . x
.Используя последнее, мы получим
...
= ((base . g) . h) x
= base (g (h x))
= g (h x)