带有操作的Haskell数据类型语法,第二部分

时间:2011-10-21 18:25:01

标签: haskell types syntax functional-programming

返回数据类型。 例如,假设我已经创建了一个数据类型:

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实例函数?

3 个答案:

答案 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实例的东西无关。

请说明您是使用ghcrunhaskell还是ghci,并尝试提供完整的最小示例。以下代码有效:

module Aaa where

data Something = Something Int Int

manipulativeFunc::Something->[Something]
manipulativeFunc x = [x]