我正在查看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_v
andmany_v
是间接无限递归的,并且它们不是用 and 来定义empty
的<|>
。
如果它们必须由实例定义,那么它们不应该有默认定义,对吧?并且由于Maybe
没有定义它们,因此我上面的声明被挂起,这对我来说似乎很奇怪,因为文档中没有提到它。
那么为什么他们被这样定义呢?有什么我想念的吗?