Создание объявлений экземпляров Haskell - PullRequest
2 голосов
/ 22 апреля 2010

Завершите noob здесь для Haskell, возможно, с еще более нудным вопросом.Я пытаюсь заставить работать вывод ghci и застреваю в объявлениях экземпляра.Как я мог объявить экземпляр для "(Show (Stack -> Stack))", учитывая:

data Cmd = LD Int
         | ADD
         | MULT
         | DUP
         deriving Show

type Prog = [Cmd]

type Stack = [Int]

type D = Stack -> Stack

Я пытался создать объявление как:

instance Show D where show = Stack

, новсе мои попытки привели к незаконным декларациям.Любая помощь и / или ссылки высоко ценится!

1 Ответ

7 голосов
/ 22 апреля 2010

Прежде всего, по умолчанию синонимы типов (то есть вещи, определенные с помощью type) не являются допустимыми в объявлениях экземпляров. Однако есть расширения GHC, позволяющие это сделать.

Кроме того, в данном конкретном случае show необходимо вернуть String; ваш экземпляр пытается вернуть имя синонима типа ..., которое даже не имеет смысла для начала, и, кроме того, ссылается на список Int, который является неправильным типом возврата для show.

Наконец, D - это тип функции - что это вообще за show? В большинстве случаев вы действительно мало что можете сделать с экземпляром Show для типа функции.

Если вы просто хотите сказать «это тип D», вы можете написать такой пример:

{-# LANGUAGE TypeSynonymInstances #-}
instance Show D where show _ = "Stack -> Stack"

Хотя я не уверен, насколько это полезно на практике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...