gpt4 book ai didi

generics - 概括 haskell 中的 Maybe 和 Either 函数

转载 作者:行者123 更新时间:2023-12-02 08:35:37 28 4
gpt4 key购买 nike

haskell 中是否有一个函数可以概括 Maybe 和 Either 函数?

例如,我正在想象一个这样的函数:

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" 。确保告诉编译器您指的是来自 Data.Foldablefoldr;请参阅模块的文档。

不幸的是,您的 GHC 版本可能缺少 Foldable (Either a) 实例,但自己编写一个实例应该相对容易。

关于generics - 概括 haskell 中的 Maybe 和 Either 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23565877/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com