似乎合法减少Eta造成了问题

时间:2018-10-04 17:02:24

标签: haskell pointfree

我正在尝试η减少功能

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
  ...

这按预期工作。看来我应该能够完全η-reduce以获得无点功能

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 :(得分:10)

由于g b = f $ a b不等于g = f $ a,所以引发了错误。

在第一种情况下,您将获得以下评估顺序:

  • 将函数a应用于b(以a作为参数调用b
  • 将函数f应用于结果

在第二种情况下:

  • 将功能f应用于a

因此,您只是flip foldMap函数,但实际上想在{em}传递flipfoldMap combiner函数对此。这使我们得出结论,即您实际上需要合成,即。 e。 .功能:

foldr = flip . foldMap where
  ...