作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图创建一个适用于 [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如果你想走泛型路线。
λ> :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/
我是一名优秀的程序员,十分优秀!