Haskell:在GHCi中使用自定义类型时出错

时间:2016-08-14 06:11:15

标签: haskell ghci

我已声明以下类型

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中测试我的功能?

2 个答案:

答案 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"