如果我有一个解析器a : Parser A
和一个解析器,b : Parser B
那么我可以将它组合成一个解析器a | b : Parser (Either A B)
.当你开始添加更多替代品并获得类似的类型时,这会有点麻烦Either A (Either B C)
.我可以想象将之前的类型扁平化为类似的东西Alternative A B C
.是否有我可以执行的标准转换,或者我坚持为类型生成一大堆样板文件Alternative A B C ...
.
有没有办法定义一个Haskell函数,它接受一个(某种类型的集合)函数并产生一个函数:它们的组成从右到左?
我试过了:
foldr ($)
但这只接受一个函数列表,其结果与其参数的类型相同:
foldr ($) :: a -> [a -> a] -> a
所以,我可以这样做:
foldr ($) 5 [(+) 1, (*) 2]
这会产生正确的结果11
然而,试图评估这个:
foldr ($) "hello" [(+) 1, length]
产生以下错误:
错误 - 列表中键入错误
*** Expression : [(1 +),length]
*** Term : length
*** Type : [a] -> Int
*** Does not match : Int -> Int