Синтаксис типа данных Haskell с манипуляциями, вторая часть - PullRequest
2 голосов
/ 21 октября 2011

Возвращение типа данных.Например, предположим, что я сделал тип данных:

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 - это все, что у меня есть.

Что я могу сделать не так?

РЕДАКТИРОВАТЬ: От комментаторов я получаю сообщение, что мне может понадобиться объявитьПокажите экземпляр для этой задачи.Итак, что если бы у меня было

data Something = Something Int Int

Тогда как бы я написал для него функцию экземпляра Show?

Ответы [ 3 ]

2 голосов
/ 21 октября 2011

Чтобы использовать функцию print, компилятор должен иметь возможность преобразовать значение в String, что обеспечивается классом Show. Вы пытаетесь отобразить функцию, и для нее не определен экземпляр Show.

Чтобы иметь возможность отобразить Something, используйте

data Something = Something Int [Char] deriving Show

manipulativeFunc не может отображаться таким образом, но его результат, если вы вызываете его с аргументом.

2 голосов
/ 21 октября 2011

Каждый раз, когда вы вычисляете выражение в ghci, ghci выводит результат этого выражения. Если выражение имеет тип, который не может быть напечатан, вы получите сообщение об ошибке выше.

Итак, проблема в том, что вы ввели выражение типа Int -> IO (), которое ghci не может распечатать, потому что это функция.

0 голосов
/ 01 ноября 2011

Вы можете использовать экземпляр 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...