我正在尝试η减少功能
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
是否有可能进一步减少η,如果可以,怎么办?
答案 0 :(得分:10)
由于g b = f $ a b
不等于g = f $ a
,所以引发了错误。
在第一种情况下,您将获得以下评估顺序:
a
应用于b
(以a
作为参数调用b
)f
应用于结果在第二种情况下:
f
应用于a
因此,您只是flip
foldMap
函数,但实际上想在{em}传递flip
后foldMap
combiner
函数对此。这使我们得出结论,即您实际上需要合成,即。 e。 .
功能:
foldr = flip . foldMap where
...