我已声明以下类型
type Parser a = String -> [(a,String)]
和一些函数在解析器上作为下面的操作
succeed :: a -> Parser a
succeed v = \inp -> [(v,inp)]
尝试运行stack ghci
以测试上述函数succeed
时出现错误,Parser不是show
的实例,所以我尝试更新代码和添加以下
instance Show Parser where
show [(v,inp)] = show (v,inp)
但我收到错误Show
期望参数为*
,但它是* -> *
我如何解决这个问题,以便在GHCi
中测试我的功能?
答案 0 :(得分:3)
好的,简短的回答是:你不能这样做。
长答案涉及使用newtype
:
newtype Parser a = Parser [(a, String)]
instance Show (Parser a) where
...
有关说明,请参阅this问题。
答案 1 :(得分:1)
这真的不是你想要的,我不会想。定义此类型解析器的常用方法是
newtype Parser a = Parser {runParser :: String -> [(a, String)]}
解析器本身是函数,其结果是列表。你不能真正展示一个非常有意义的东西。其他答案的一个选项是为解析器结果编写自定义类型:
newtype Parser a = Parser {runParser :: String -> Result a}
newtype Result a = Result {getResult :: [(a, String)]}
instance Show a => Show (Result a) where
show (Result xs) = case xs of
[] -> "No results"
[x] -> "One result: " ++ show x
_ -> "Multiple results"