返回数据类型。 例如,假设我已经创建了一个数据类型:
data Something = Something Int [Char]
然后,我使用以下函数进行了一些操作(其确切的功能是无关紧要的):
manipulativeFunc::Something->[Something]
我不断收到这些奇怪的错误消息
Top level:
No instance for (Show (Int -> IO ()))
arising from use of 'print' at Top level
Probable fix: add an instance declaration for (Show (Int -> IO ()))
In a 'do' expression: print it
请注意,我的程序中没有任何打印用途,也没有使用IO。数据声明和manipulativeFunc
就是我所拥有的。
我可能做错了什么?
编辑:从评论者那里,我得到的消息是,我可能需要为此任务声明一个Show实例。那么,如果我有什么
data Something = Something Int Int
然后我将如何为它编写Show实例函数?
答案 0 :(得分:2)
每次在ghci中计算表达式时,ghci都会打印该表达式的结果。如果表达式具有无法打印的类型,则会收到上述错误消息。
所以问题是你输入了Int -> IO ()
类型的表达式,ghci无法打印,因为它是一个函数。
答案 1 :(得分:2)
为了使用函数print
,编译器需要能够将值转换为String
,这由Show
类确保。您尝试显示一个函数,并且没有为其定义Show
实例。
为了能够显示您的Something
,请使用
data Something = Something Int [Char] deriving Show
manipulativeFunc
无法以这种方式显示,但如果您使用参数调用它,则会显示结果。
答案 2 :(得分:0)
您可以使用默认的Show实例:
data Something = Something Int Int deriving Show
或者您可以定义自己的:
instance Show Something where
show (Something a b) = "<" ++ show a ++ " " ++ show b ++ ">"
但是你的问题与没有Show实例的东西无关。
请说明您是使用ghc
,runhaskell
还是ghci
,并尝试提供完整的最小示例。以下代码有效:
module Aaa where
data Something = Something Int Int
manipulativeFunc::Something->[Something]
manipulativeFunc x = [x]