Haskell:应用函子

Xie

我是Haskell的新手。我输入了Maybe3类型。

data Maybe3 a= Just3 a| Unknown3 | Missing3 deriving (Show, Eq, Ord)
eq3 :: Eq a => Maybe3 a-> Maybe3 a-> Bool3
eq3 Unknown3 _ = Unk3
eq3 Missing3 _ = False3
eq3 _ Missing3 = False3
eq3 _ Unknown3 = Unk3 
eq3 (Just3 a) (Just3 b)=if a==b then True3 else False3

如何使Maybe3成为实用函数?以及如何使其成为Monad?

安德鲁·C

关键思想

我的理解是,Missing3Unknown3工作有点像Nothing,但他们给,为什么没有答案有点更多的反馈,所以可能会略有不同的行为给对方。当然我认为Missing3应该表现得像Nothing

让我们看看如何为这些定义Maybe

函子

这是Functor实例Maybe

instance  Functor Maybe  where
    fmap _ Nothing       = Nothing
    fmap f (Just a)      = Just (f a)

我认为这是明确如何处理Missing3Unknown3这里。

单子

instance  Monad Maybe  where
    (Just x) >>= k      = k x
    Nothing  >>= _      = Nothing

    (Just _) >>  k      = k
    Nothing  >>  _      = Nothing

    return              = Just
    fail _              = Nothing

您不能>>=为forMissing3Unknown3这样做,因为您没有绑定的值。唯一的问题是您是否失败Unknown3Missing3

适用性

这是更多挖掘的地方:

instance Applicative Maybe where
    pure = return
    (<*>) = ap

ap                :: (Monad m) => m (a -> b) -> m a -> m b
ap                =  liftM2 id

liftM2  :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 f m1 m2          = do { x1 <- m1; x2 <- m2; return (f x1 x2) }

现在翻译成

mf <*> mx = do
    f <- mf
    x <- mx
    return (f x)

您可以一直使用它来将Monad变成Applicative。

撇开:适用性很好。

事实上,只要您发现自己在写作

this thing = do
    something <- some monadic thing
    more <- some other thing
    yetmore <- another thing too
    return (combine something more yetmore)

您应该使用适用的符号将其重写:

this thing = combine <$> some monadic thing 
                     <*> some other thing 
                     <*> another thing too

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

F# 中的 Haskell 应用函子

来自分类Dev

为什么在Haskell中无法导出应用函子?

来自分类Dev

如何让Haskell将函数识别为应用函子

来自分类Dev

试图更好地了解Haskell中的应用函子的(<*>)函数

来自分类Dev

Haskell-应用将函子返回到函子的函数

来自分类Dev

Haskell fmap函子

来自分类Dev

Haskell-函子

来自分类Dev

应用函子分析

来自分类Dev

Haskell-您可以使用不是应用函子的monad吗?

来自分类Dev

您如何使用haskell parsec库解析带有应用函子的Intel Hex Record?

来自分类Dev

Haskell-您可以使用不是应用函子的monad吗?

来自分类Dev

简单的应用函子示例

来自分类Dev

列表上的应用函子

来自分类Dev

(r->)应用函子

来自分类Dev

应用函子的反向提升

来自分类Dev

Haskell:嵌套函子上的fmap

来自分类Dev

更改Haskell的函子进行元编程

来自分类Dev

了解Scala中的应用函子

来自分类Dev

应用函子中的条件循环

来自分类Dev

没有应用函数的函子示例

来自分类Dev

组成Monad诉应用函子

来自分类Dev

Monads VS期货的应用函子

来自分类Dev

应用脚本中的函子和记录

来自分类Dev

使用组合函子的应用实例

来自分类Dev

混淆应用函子中的纯

来自分类Dev

haskell,数据二叉树的函子

来自分类Dev

在Haskell中使Data.Map成为函子

来自分类Dev

Haskell中的OCaml函子(参数化模块)仿真

来自分类Dev

Haskell中的函子:显示type参数类型的项的值