Казалось бы, законное сокращение Eta вызывает проблемы - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь η-уменьшить функцию

foldr :: (a -> b -> b) -> b -> BinaryTree a -> b
foldr combiner base tree = foldMap combiner tree base where
  foldMap = ...

при

foldMap :: (a -> b -> b) -> BinaryTree a -> b -> b

, работающем по назначению.

Я уменьшил η

foldr combiner base tree = foldMap combiner tree base

до

foldr combiner = flip $ foldMap combiner where
  ...

Это работает как задумано.Кажется, что я должен быть в состоянии η-уменьшить полностью, чтобы получить функцию без точек

foldr = flip $ foldMap where
  ...

Однако, это вызывает ошибку компиляции

Couldn't match type ‘a -> b -> b’ with ‘BinaryTree t0’
Expected type: (a -> b -> b) -> b -> BinaryTree a -> b
  Actual type: BinaryTree t0 -> (t0 -> b -> b) -> b -> b

Возможно ли η-уменьшить дальшеи если да, то как?

1 Ответ

0 голосов
/ 04 октября 2018

Ошибка возникает, потому что g b = f $ a b не эквивалентно g = f $ a.

. В первом случае вы получаете следующую последовательность вычислений:

  • применить функциюa до b (вызов a с b в качестве аргумента)
  • применение функции f к результату

Во втором случае:

  • применить функцию f к a

Таким образом, вы просто flip foldMap функция, но на самом деле хотите flip foldMap функция после передачи combiner в нее.Это приводит нас к выводу, что вы на самом деле хотите композицию, т.е. функцию .:

foldr = flip . foldMap where
  ...
...