gpt4 book ai didi

haskell - 是否有创建 [Maybe a] 模拟的语法,但类型 (* -> *)

转载 作者:行者123 更新时间:2023-12-04 12:07:14 25 4
gpt4 key购买 nike

我试图创建一个适用于 [Maybe a] 的 fmap .然而,也许有种* , 和 fmap 要求种类 * -> * .这导致了以下不幸的解决方案:

newtype Unfortunate a = Unfortunate ([Maybe a]) deriving Show

instance Functor Unfortunate
where fmap f (Unfortunate a) = Unfortunate $ (fmap (fmap f)) a


-- |
-- >>> l = Unfortunate [Just 10, Just 1, Nothing, Just 15]
-- >>> fmap (*5) l
-- Unfortunate [Just 50,Just 5,Nothing,Just 75]
不幸的是必须创建一个 newtype根本。我希望可以创建一个适用于 [Maybe a] 的实例。 ,对于任何 a .即,可以称为 fmap f [Just 10, Nothing] 的东西.
我似乎缺少一些语法。是否可以定义这样的实例?

最佳答案

MaybeT完全(甚至更多)做您的 Unfortunate做:

λ> import Control.Monad.Trans.Maybe
λ> (*2) <$> MaybeT [Just 1, Just 2, Nothing]
MaybeT [Just 2,Just 4,Nothing]
λ> pure 1 :: MaybeT [] Int
MaybeT [Just 1]
您还可以使用 DeriveFunctor 标志并机械派生“不幸的仿函数”:
λ> :set -XDeriveFunctor 
λ> newtype Unfortunate a = Unfortunate ([Maybe a]) deriving (Functor, Show)
λ> (*2) <$> Unfortunate [Just 1, Just 2, Nothing]
Unfortunate [Just 2,Just 4,Nothing]
λ>
还有 generic-functor如果你想走泛型路线。
编辑:
另一种选择是使用 GeneralizedNewtypeDeriving:
λ> :set -XGeneralizedNewtypeDeriving 
λ> (*2) <$> Unfortunate (MaybeT [Just 1, Just 2, Nothing])
Unfortunate (MaybeT [Just 2,Just 4,Nothing])
编辑2:
正如丹尼尔瓦格纳在评论中指出的那样,我们也可以使用:
λ> import Data.Functor.Compose
λ> (*2) <$> Compose [Just 1, Just 2, Nothing]
Compose [Just 2,Just 4,Nothing]

关于haskell - 是否有创建 [Maybe a] 模拟的语法,但类型 (* -> *),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68124405/

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