Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何习惯性地在[其中一个]上使用bimap?也许可以使用两个函数映射[其中一个]的元素_Haskell - Fatal编程技术网

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!!!"]