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

我正在查看
haskell中的Alternative类型类,当我发布时,我正在ghci中使用它

some (Just 2)

它挂了,我查看了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_v和many_v是间接无限递归的,并且它们没有以空和< |>的形式定义.

如果它们必须由实例定义,那么它们不应该有默认定义,对吧?因为也许没有定义它们,我上面的陈述被绞死了,这对我来说很奇怪,因为它没有在文档中提到过.

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

最佳答案 Maybe的Alternative实例如下:

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

它定义了空和(< |>),将一些和许多作为其默认实现.

当替代品可以成功或失败时,使用许多和一些有意义的“外部原因”不包含在价值本身中.典型示例是解析器:您尝试从输入流重复解析整数,直到找不到整数并返回空.

但是对于Just 2,备选方案“总是成功”,可以这么说.没有任何外部的价值可以使它“失败”并完成计算.所以它进入了无限循环.

点赞