我正在查看
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,备选方案“总是成功”,可以这么说.没有任何外部的价值可以使它“失败”并完成计算.所以它进入了无限循环.