Parsing 单子的数据插入列表

Parsing 单子的数据插入列表,parsing,haskell,monads,Parsing,Haskell,Monads,我正在使用该模块编写一个小型解析器。我有这样的表达: cmdExpr = string "create" <|> string "add" <|> string "another alias" <|> ... 有什么想法吗?您可以选择: 您可以使用以下选项: 你需要的是折叠 不是列表元素,它是一个包含两个参数的关联函数 您需要这样做: getExpr cmds = foldr1 (<|>) $ map string cmds 请注意,使用fol

我正在使用该模块编写一个小型解析器。我有这样的表达:

cmdExpr = string "create" <|> string "add" <|> string "another alias" <|> ...
有什么想法吗?

您可以选择:

您可以使用以下选项:


你需要的是折叠

不是列表元素,它是一个包含两个参数的关联函数

您需要这样做:

getExpr cmds = foldr1 (<|>) $ map string cmds

请注意,使用foldr1是一个快速而肮脏的修复方法:如果给定一个空列表,它将抛出一个异常。健壮的方法是使用foldr和某种空解析器作为基本情况。

您需要的是fold

不是列表元素,它是一个包含两个参数的关联函数

您需要这样做:

getExpr cmds = foldr1 (<|>) $ map string cmds

请注意,使用foldr1是一个快速而肮脏的修复方法:如果给定一个空列表,它将抛出一个异常。健壮的方法是使用foldr和某种空解析器作为基本情况。

这是以下方面的最佳使用情况:

如果您使用的不是Relude,而是其他第三方库,那么还有其他相同的功能,例如:

如果您想坚持使用Base,则可以分别使用asum和map:


这是以下方面的完美用例:

如果您使用的不是Relude,而是其他第三方库,那么还有其他相同的功能,例如:

如果您想坚持使用Base,则可以分别使用asum和map:

foldr empty以asum的形式存在-由于它位于数据中,所以很难找到它。foldr empty以asum的形式存在,因为它位于数据中。foldr empty可折叠,而不是使用Alternative的定义。foldr empty以asum的形式存在,因为它位于数据中。foldr empty可折叠,而不是使用Alternative的定义。
getExpr cmds = foldr1 (<|>) $ map string cmds
getExpr cmds = asumMap string cmds
cmdExpr = getExpr ["create", "add", "another alias", ...]
import Util (altMap)
getExpr cmds = altMap string cmds
cmdExpr = getExpr ["create", "add", "another alias", ...]
import Data.Foldable (asum)
getExpr cmds = asum $ map string cmds
cmdExpr = getExpr ["create", "add", "another alias", ...]