4

我正在查看Alternativehaskell 中的 typeclass,当我发布这个时,我正在 ghci 中使用它

some (Just 2)

它挂了,我查看了Alternative的源代码,Alternative的一些和许多默认定义是这样的:

some :: f a -> f [a]
some v = some_v
  where
    many_v = some_v <|> pure []
    some_v = (fmap (:) v) <*> many_v

-- | Zero or more.
many :: f a -> f [a]
many v = many_v
  where
    many_v = some_v <|> pure []
    some_v = (fmap (:) v) <*> many_v

很明显some_vandmany_v是间接无限递归的,并且它们不是用 and 来定义empty<|>

如果它们必须由实例定义,那么它们不应该有默认定义,对吧?并且由于Maybe没有定义它们,因此我上面的声明被挂起,这对我来说似乎很奇怪,因为文档中没有提到它。

那么为什么他们被这样定义呢?有什么我想念的吗?

4

1 回答 1

1

Maybe 的 Alternative 实例如下:

instance Alternative Maybe where
    empty = Nothing
    Nothing <|> r = r
    l       <|> _ = l

它定义了emptyand (<|>),将someandmany作为它们的默认实现。

当由于值本身不包含的“外部原因”而成功或失败时,使用manyandsome是有意义的。Alternative典型的例子是解析器:您尝试从输入流中重复解析整数,直到找不到整数并empty返回。

但是,Just 2可以说,替代方案“总是成功”。该值没有任何外部因素可以使其“失败”并完成计算。所以它进入了一个无限循环。

于 2016-09-24T10:06:46.700 回答