我在看 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
和 many_v
是间接的无限递归的,它们不是以 empty
和 <|>
.
如果它们必须由实例来定义,那么它们就不应该有默认的定义,对吗?Maybe
并没有定义他们,我上面的声明挂了,这对我来说似乎很奇怪,因为它没有在文档中提到。
那为什么要这样定义呢 我是不是漏掉了什么?
Maybe的替代实例如下:
instance Alternative Maybe where
empty = Nothing
Nothing <|> r = r
l <|> _ = l
它定义了 empty
和 (<|>)
,留下 some
和 many
作为它们的默认实现。
使用 many
和 some
有道理 Alternative
可以因为价值本身不包含的 "外部原因 "而成功或失败。典型的例子是解析器:你试图从一个输入流中反复解析整数,直到没有找到一个整数为止,然后用 empty
是返回。
但随着 Just 2
可以说,"另类 "总是成功的。没有任何外在的东西可以让这个值 "失败",完成计算。所以就进入了一个无限循环。