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"
我已经声明了以下类型
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"