【问题标题】:Haskell - creation of a monadHaskell - 创建一个单子
【发布时间】:2016-06-05 22:18:09
【问题描述】:

我正在尝试了解如何创建 monad 的规则。据我了解,这取决于我要使用的数据类型以及 monad 必须满足三个定律:

1. m >>= return = m
2. return x >>= f = f x
3. (m >>= f) >>= g = m >>= (\x-> f x) >>= g

好的。所以对于一个单子Maybe 我有最后两行。第三行中的“x”代表什么。如果应该是一个函数,它不应该吗?

data Maybe a = Nothing | Just a
instance Monad Maybe where
  (Just x) >>= f = f x
  Nothing >>= _ = Nothing
  _ >>= x = x  

 fail _ = Nothing

(我现在无法找到这个定义的来源,但我在某个地方找到了它)

我也找到了另一个版本 - 为什么我需要带有“失败”的行?

data Maybe a = Nothing | Just a
instance Monad Maube where
  return x = Just x

  Just x >>= f = f x
  Nothing >>= f = Nothing

  fail _ = Nothing

(来源:http://learnyouahaskell.com/a-fistful-of-monads

【问题讨论】:

  • 您能否提供这些定义的来源?
  • _ >>= x = x 是错误的。 >>= 具有 m a -> (a -> m b) -> m b 类型,因此该定义忽略了 m a 值(我们知道它是 Just,但在这里无关紧要),并尝试返回 a -> m b 值,就好像它是m b.
  • 确实如此。 究竟在哪里你在_ >>= x = x 中找到了这个定义?至少它既不在 LYAH 的在线版本中,也不在我的印刷版中。而且,不应该是错误的。
  • @chepner 我认为这并不重要。那行代码只是死代码,永远无法访问。
  • @Sibi 还是要进行类型检查,否则编译器会拒绝。

标签: haskell


【解决方案1】:

我建议您通读 this chapter of 'Learn you a Haskell',它提供了一些示例,可以帮助您阐明什么是 monad。

回到你关于x 的问题,它不是一个函数,而是Just 中包含的值。 Maybe a 是一个具有两个不同构造函数的类型:Nothing,这意味着它没有任何值,Just a,这意味着它拥有一个 a 类型的值。

我们来看看>>=的签名。它是(>>=) :: m a -> (a -> m b) -> m b,这意味着它接受一个单子m a,一个函数(a -> m b),并返回一个单子m b。请注意,您有相同的 monad m,但其类型参数的值可能不同(从 ab)。

对于Maybe a,我们需要处理两种情况:当我们有值时(Just a)或当我们没有值时(Nothing)。 >>= for Maybe 的实现方式是将f 应用于存在值的值,否则它只是传播Nothing。在您的示例中,您也有 _ >>= x = x,但这不是必需的,因为您已经详尽地匹配了所有可能的模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多