Haskell 替代方案中 "some" 和 "many" 函数的定义是什么意思
What is the meaning of the definitions for the "some" and "many" functions in the Haskell Alternative
我一直在寻找在 Haskell 中编写词法分析器并偶然发现了这些函数。
If defined, some
and many
should be the least solutions of the
equations:
some v = (:) <$> v <*> many v
many v = some v <|> pure []
我知道 some
中的 (:)
被提升并应用于 v
的值,以便将其添加到 many v
中返回的列表中。
但是为什么many
的定义要以some
开头呢?为什么它会与 pure []
连接起来?
这两个函数有什么关系或区别? some
和 many
是这些方程的 最小 解是什么意思?递归如何停止?求助!
some p
表示 一个 或更多匹配 p
many p
表示 零 或更多匹配 p
对于输入 "abc"
、many letter
和 some letter
都将解析 abc
。
但是对于输入"123"
,many letter
将输出空字符串""
。 some letter
会报错
根据定义。 some v
至少需要1个v
的匹配,所以我们可以先解析v
然后我们需要0个或更多的v
匹配,即many v
。它是这样的:
some v = do
first_match <- v
rest_matches <- many v
return $ first_match : rest_matches
与some v = (:) <$> v <*> many v
相同。
但是 many v
。它将匹配 some v
(1 个或多个)或不匹配(纯 [])。
many v = if matches (some v) then return (some v) else return nothing
.
您可以尝试从 codewars 中解决 writing applicative parsers from scratch。
Functional pearls 也是一个关于解析组合器的很好的参考。
我一直在寻找在 Haskell 中编写词法分析器并偶然发现了这些函数。
If defined,
some
andmany
should be the least solutions of the equations:
some v = (:) <$> v <*> many v
many v = some v <|> pure []
我知道 some
中的 (:)
被提升并应用于 v
的值,以便将其添加到 many v
中返回的列表中。
但是为什么many
的定义要以some
开头呢?为什么它会与 pure []
连接起来?
这两个函数有什么关系或区别? some
和 many
是这些方程的 最小 解是什么意思?递归如何停止?求助!
some p
表示 一个 或更多匹配 pmany p
表示 零 或更多匹配 p
对于输入 "abc"
、many letter
和 some letter
都将解析 abc
。
但是对于输入"123"
,many letter
将输出空字符串""
。 some letter
会报错
根据定义。 some v
至少需要1个v
的匹配,所以我们可以先解析v
然后我们需要0个或更多的v
匹配,即many v
。它是这样的:
some v = do
first_match <- v
rest_matches <- many v
return $ first_match : rest_matches
与some v = (:) <$> v <*> many v
相同。
但是 many v
。它将匹配 some v
(1 个或多个)或不匹配(纯 [])。
many v = if matches (some v) then return (some v) else return nothing
.
您可以尝试从 codewars 中解决 writing applicative parsers from scratch。
Functional pearls 也是一个关于解析组合器的很好的参考。