haskell 中是否有一个函数可以概括可能和任一函数?
例如,我正在想象一个这样的函数:
generalizedFunc :: SOMETHING m => b -> (a -> b) -> m a -> b
generalizedFunc valForError f value = ...
在 ghci 中使用它看起来像这样:
> generalizedFunc "bye" (\_ -> "hello") (Just 3)
"hello"
> generalizedFunc "bye" (\_ -> "hello") Nothing
"bye"
> generalizedFunc "bye" (\_ -> "hello") (Right 3)
"hello"
> generalizedFunc "bye" (\_ -> "hello") (Left "error")
"bye"
注意:Tom Ellis 提出了一个很好的观点,即这不是Either 的概括,而是一种专门化。
最佳答案
是的。您正在寻找的是 Data.Foldable
。它将 foldr
(用于列表)推广到任何代数数据类型:
Data.List.foldr :: (a -> b -> b) -> b -> [] a -> b
maybe :: b -> (a -> b) -> Maybe a -> b
either :: (a -> c) -> (b -> c) -> Either a b -> c
---
Data.Foldable.foldr :: Foldable t
=> (a -> b -> b) -> b -> t a -> b
您的代码将从
generalizedFunc "bye" (\_ -> "hello")
更改为 foldr (\_ _ -> "hello") "bye"
。确保你告诉编译器你的意思是 foldr
中的 Data.Foldable
;请参阅模块的文档。不幸的是,您的 GHC 版本可能缺少
Foldable (Either a)
实例,但自己编写一个实例应该相对容易。关于generics - 概括haskell中的可能和任一功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23565877/