为什么Alternative的some和many是hashkell中的无限递归函数?

问题描述 投票:4回答:1

我在看 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_vmany_v 是间接的无限递归的,它们不是以 empty<|>.

如果它们必须由实例来定义,那么它们就不应该有默认的定义,对吗?Maybe 并没有定义他们,我上面的声明挂了,这对我来说似乎很奇怪,因为它没有在文档中提到。

那为什么要这样定义呢 我是不是漏掉了什么?

haskell recursion typeclass some-and-many haskell-alternative
1个回答
1
投票

Maybe的替代实例如下:

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

它定义了 empty(<|>),留下 somemany 作为它们的默认实现。

使用 manysome 有道理 Alternative 可以因为价值本身不包含的 "外部原因 "而成功或失败。典型的例子是解析器:你试图从一个输入流中反复解析整数,直到没有找到一个整数为止,然后用 empty 是返回。

但随着 Just 2可以说,"另类 "总是成功的。没有任何外在的东西可以让这个值 "失败",完成计算。所以就进入了一个无限循环。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.