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

Haskell: error while using custom type in 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 中测试我的功能?

好吧,简短的回答是:你不能这样做。

长答案涉及使用 newtype:

newtype Parser a = Parser [(a, String)]

instance Show (Parser a) where
  ...

有关解释,请参阅 this 问题。

只需在 GHCi 中输入:

let succeed :: a -> String -> [(a, String)]; succeed v = \inp -> [(v, inp)]

测试:

succeed 12 "str"

输出:

[(12,"str")]

测试:

Prelude> :t succeed
succeed :: a -> String -> [(a, String)]

这也适用于 GHCi

type Parser a = String -> [(a,String)]
let succeed :: a -> Parser a; succeed v = \inp -> [(v, inp)]

测试:

succeed 12 "str"

输出:

[(12,"str")]

测试:

Prelude> :t succeed
succeed :: a -> Parser a

这真的不是你想要的,我不认为。定义这种类型的解析器的通常方法是

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"