gpt4 book ai didi

parsing - 函数定义中的相互引用

转载 作者:行者123 更新时间:2023-12-02 14:24:51 27 4
gpt4 key购买 nike

一些许多定义here具有相互引用的内部表达式。我觉得这很难理解。

some :: f a -> f [a]
some v = some_v
where
many_v = some_v <|> pure []
some_v = (:) <$> v <*> many_v

-- | Zero or more.
many :: f a -> f [a]
many v = many_v
where
many_v = some_v <|> pure []
some_v = (:) <$> v <*> many_v

many_vsome_v 的类型签名是什么?

如何评估以下内容(使用parsec)?

Prelude Text.Parsec> parse (many (oneOf "abc")) mempty "abc"
Right "abc"

最佳答案

这两个函数都有像

这样的签名
many_v :: (Alternative f) => f [a]
some_v :: (Alternative f) => f [a]

用可以简化的定义替换绑定(bind)

some v = some_v
where
some_v = (:) <$> v <*> (some_v <|> pure [])

many v = many_v
where
many_v = ( (:) <$> v <*> many_v) <|> pure []
<小时/>
some v = (:) <$> v <*> (some v <|> pure [])
many v = ((:) <$> v <*> many v) <|> pure []
<小时/>

通常您将这些函数简单地定义为

many v = some v <|> pure []
some v = (:) <$> v <*> many v

在大多数项目中,递归函数都是定义的工作包装函数,以便编译器能够进行更多优化

关于parsing - 函数定义中的相互引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59489494/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com