Haskell 如何习惯性地在[其中一个]上使用bimap?也许可以使用两个函数映射[其中一个]的元素
如何以更惯用的方式将两个函数应用于Haskell 如何习惯性地在[其中一个]上使用bimap?也许可以使用两个函数映射[其中一个]的元素,haskell,Haskell,如何以更惯用的方式将两个函数应用于列表中的a b(我猜它可能正确地应用了bimap)?(无需使用实例…其中因为我希望不同fg函数的“一次性”应用程序具有灵活性->bieithertransfermgenerator和biEitherFmap允许一行程序) 我尝试使用bimap将两个函数映射到列表中的a b: biEitherTransformGenerator :: (a->c) -> (b->d) -> Either a b -> Either c d biEit
列表中的a b
(我猜它可能正确地应用了bimap
)?(无需使用实例…其中
因为我希望不同fg
函数的“一次性”应用程序具有灵活性->bieithertransfermgenerator
和biEitherFmap
允许一行程序)
我尝试使用bimap
将两个函数映射到列表中的a b
:
biEitherTransformGenerator :: (a->c) -> (b->d) -> Either a b -> Either c d
biEitherTransformGenerator f g (Left x) = Left $ f x
biEitherTransformGenerator f g (Right x) = Right $ g x
biEitherFmap :: (Functor container) => (a->c) -> (b->d) -> container (Either a b) -> container (Either c d)
biEitherFmap f g = fmap $ biEitherTransformGenerator f g
el = [Left 5, Right "foo", Left 10, Right "bar"]:: [Either Int [Char]]
main = do
print el
let l1 = fmap (biEitherTransformGenerator (*2) (++"!!!")) el
print l1
let l2 = biEitherFmap (*2) (++"!!!") el
print l2
print $ l1 == l2
-- let l3 = fmap (bimap (*2) (++"!!!")) el
-- print l3
runhaskell DoubleFunctor.hs的输出
[Left 5,Right "foo",Left 10,Right "bar"]
[Left 10,Right "foo!!!",Left 20,Right "bar!!!"]
[Left 10,Right "foo!!!",Left 20,Right "bar!!!"]
True
每次我取消注释最后两行时:
let l3 = fmap (bimap (*2) (++"!!!")) el
print l3
我得到:
DoubleFunctor.hs:14:20: error:
Variable not in scope:
bimap
:: (Integer -> Integer)
-> ([Char] -> [Char]) -> Either Int [Char] -> b
|
14 | let l3 = fmap (bimap (*2) (++"!!!")) el
| ^^^^^
我试图达到的目标是:以更为独特的方式完成fmap(BieitherTransferMgGenerator f g)列表,或
BieitherMap f g列表,而Bifunctor
类不是前奏的一部分;您需要首先从Data.Bifunctor
导入它。(根据您的安装情况,模块可能由base
库提供,或者您可能需要先安装bifunctors
库。)
前奏曲>:t bimap
:1:1:错误:变量不在范围内:bimap
前奏曲>导入数据.Bifunctor
前奏曲数据.Bifunctor>:t bimap
bimap::Bifunctor p=>(a->b)->(c->d)->p a c->p b d
前奏曲数据.Bifunctor>el=[左5,右“foo”,左10,右“bar”]
前奏曲数据.Bifunctor>fmap(bimap(*2)(+“!!!”)el
[左10,右“foo!!!”,左20,右“bar!!!”]
Bifunctor
课程不是前奏曲的一部分;您需要首先从Data.Bifunctor
导入它。(根据您的安装情况,模块可能由base
库提供,或者您可能需要先安装bifunctors
库。)
前奏曲>:t bimap
:1:1:错误:变量不在范围内:bimap
前奏曲>导入数据.Bifunctor
前奏曲数据.Bifunctor>:t bimap
bimap::Bifunctor p=>(a->b)->(c->d)->p a c->p b d
前奏曲数据.Bifunctor>el=[左5,右“foo”,左10,右“bar”]
前奏曲数据.Bifunctor>fmap(bimap(*2)(+“!!!”)el
[左10,右“foo!!!”,左20,右“bar!!!”]
您需要先导入,它来自Bifunctor
库(您可能需要先安装;我不记得这是否是标准库)。@chepner Data.Bifunctor现在在base中,无需安装任何东西,除非您有一个旧的ghc。谢谢您的评论!我的安装出了问题。你激励我重新安装东西并最终导入作品!您需要首先导入,它来自Bifunctor
库(您可能需要首先安装;我不记得这是否是标准库之一)。@chepner Data.Bifunctor现在在base中,无需安装任何东西,除非您有一个旧的ghc。谢谢您的评论!我的安装出了问题。你激励我重新安装东西并最终导入作品!我在尝试导入时遇到了一些安装问题和奇怪的错误。所以我想这可能不是进口的东西。多亏了你的回答,我重新安装了一些东西以确保导入成功!谢谢我在尝试导入时遇到了一些安装问题和奇怪的错误。所以我想这可能不是进口的东西。多亏了你的回答,我重新安装了一些东西以确保导入成功!谢谢
Prelude> :t bimap
<interactive>:1:1: error: Variable not in scope: bimap
Prelude> import Data.Bifunctor
Prelude Data.Bifunctor> :t bimap
bimap :: Bifunctor p => (a -> b) -> (c -> d) -> p a c -> p b d
Prelude Data.Bifunctor> el = [Left 5, Right "foo", Left 10, Right "bar"]
Prelude Data.Bifunctor> fmap (bimap (*2) (++"!!!")) el
[Left 10,Right "foo!!!",Left 20,Right "bar!!!"]