【发布时间】:2016-09-24 09:13:55
【问题描述】:
我在 Haskell 中查看 Alternative 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 和many_v 是间接无限递归的,它们不是根据empty 和<|> 定义的。
如果它们必须由实例定义,那么它们不应该有默认定义,对吧?并且由于Maybe 没有定义它们,因此我上面的声明被挂起,这对我来说似乎很奇怪,因为文档中没有提到它。
那么为什么他们被这样定义呢?有什么我想念的吗?
【问题讨论】:
-
many Nothing和some Nothing工作正常。你希望some (Just 2)做什么? -
@melpomene
Just [2]或exception : unimplemented -
Just [2]在语义上是错误的。它必须是Just [2, 2, 2, 2, 2, 2, ...],但计算永远不会完成。 -
@melpomene hmmm 如果是
Just [2,2,2,2,...]那么take 2 <$> (some (Just 2))不会返回一些结果吗? (它挂在我身上) -
不,因为它实际上不能返回它(至少在当前定义下,它必须“运行操作”,直到
v在某个时候变成empty)。嗯。
标签: haskell recursion typeclass some-and-many alternative-functor