Синтаксис прагмы в Haskell - PullRequest
1 голос
/ 30 марта 2020
module Practice where

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

class TooMany a where 
  tooMany :: a -> Bool

instance TooMany Int where
   tooMany n = n > 42 

newtype Goats =
  Goats Int deriving (Eq, Show)

--What I load into the playground
tooMany (Goats 17)

--the error I get: " No instance for (TooMany Goats) arising from a use of ‘tooMany’ "

Я считаю, что этот код должен работать, но он не работает, потому что я использую Haskell Для Ма c, который может использовать разные обозначения для прагм.

1 Ответ

6 голосов
/ 30 марта 2020

Когда вы используете GeneralizedNewtypeDeriving, вам все равно нужно указать, какие экземпляры вы хотите «позаимствовать» из упакованного типа в предложении deriving, поэтому вы определяете Goat введите с помощью:

newtype Goats = Goats Int deriving (Eq, Show<b>, TooMany</b>)

Обратите внимание, что, как и @ RobinZigmond говорит , вам необходимо определить прагмы вверху файла, поэтому:

{-# LANGUAGE <b>GeneralizedNewtypeDeriving</b> #-}

module Practice where

class TooMany a where 
  tooMany :: a -> Bool

instance TooMany Int where
   tooMany n = n > 42 

newtype Goats = Goats Int deriving (Eq, Show, TooMany)

В GHCi мы можем запросить, например:

*Practice> tooMany (Goats 12)
False

Хотя я проводил этот эксперимент на машине Linux, я был бы очень удивлен, что это не работает на другой платформе , Тем более что такие языковые расширения не имеют ничего общего с платформой, на которой они работают. Языковые расширения обычно не зависят от платформы, поэтому, как @ DanielWagner говорит , добавление класса типов в deriving должно быть сделано на всех платформах.

...