haskell - 为什么替代的一些和许多是haskell中的无限递归函数

标签 haskell recursion typeclass some-and-many alternative-functor

我在看 Alternative haskell 中的 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_vmany_v是间接无限递归的,它们不是根据 empty 定义的和 <|> .

如果它们必须由实例定义,那么它们不应该有默认定义,对吗?自 Maybe没有定义它们我上面的语句被绞死,这对我来说似乎很奇怪,因为它没有在文档中提到。

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

最佳答案

Maybe 的 Alternative 实例如下:

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

它定义了 empty(<|>) , 离开 somemany作为他们的默认实现。

使用 manysomeAlternative 有意义时可能因值本身不包含的“外部原因”而成功或失败。典型的例子是解析器:你尝试从输入流中重复解析整数,直到找不到整数并且 empty被退回。

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

关于haskell - 为什么替代的一些和许多是haskell中的无限递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39674640/

相关文章:

Haskell 二次方程根

haskell - uncurry 函数的类型签名

python - 展平字典时处理自引用

haskell - 在 Haskell 中用(广义的)箭头写阶乘

scala - 尝试实现 `Absurd` 类型类时的隐式错误

haskell - 为什么所有 Haskell 类型类都有法则?

list - Haskell - 列出多个参数的模式匹配? (不能构造无限类型)

haskell - 如何将 [IO X] 转换为 IO [X]

javascript - 如何使用递归计算字符串中的所有回文?

javascript - 在 JavaScript 中不使用 .concat 或 .reduce 的嵌套数组的递归方法