Отображение числа с предшествующим знаком «+» - PullRequest
1 голос
/ 20 сентября 2019

Я новичок в функциональном программировании и Haskell, и мне очень трудно разобраться в создании ваших собственных типов данных.В качестве источника обучения я использую http://learnyouahaskell.com/,, но все еще не могу понять некоторые идеи.

Моя конкретная проблема заключается в том, что я пытаюсь создать экземпляр для своих пользовательских данных.тип, который всегда показывает символ «+» перед тем, что отображается (в моем случае ввод 555 будет «+555»).Вот как я пытался это решить.

data CountryCode = CountryCode Integer deriving Eq

instance Show CountryCode where
    show _ = "+" : _

И вот что я получаю, когда пытаюсь его загрузить.

[1 of 1] Compiling Main             ( phonetest.hs, interpreted )

phonetest.hs:6:14: error:
    • Couldn't match type ‘[Char]’ with ‘Char’
      Expected type: String
        Actual type: [[Char]]
    • In the expression: "+" : _
      In an equation for ‘show’: show _ = "+" : _
      In the instance declaration for ‘Show CountryCode’

phonetest.hs:6:20: error:
    • Found hole: _ :: [[Char]]
    • In the second argument of ‘(:)’, namely ‘_’
      In the expression: "+" : _
      In an equation for ‘show’: show _ = "+" : _
    • Relevant bindings include
        show :: CountryCode -> String (bound at phonetest.hs:6:5)
Failed, modules loaded: none.

Я могу получить что-то изсообщение об ошибке, но недостаточно, чтобы заставить его работать правильно.Я также пытался show (CountryCode _) = "+" : _, но haskell все еще жалуется.Мне это кажется довольно логичным, но очевидно, что мне не хватает базовых знаний о хаскеле.

1 Ответ

4 голосов
/ 20 сентября 2019

Вы должны распаковать конструктор данных и таким образом получить параметр x.Затем мы можем использовать охранники, чтобы проверить, является ли значение положительным или отрицательным.Если оно положительное, мы можем добавить 'x' к результату show x:

instance Show CountryCode where
    show (CountryCode x) | x >= 0 = '+' : show x
                         | otherwise = show x

или мы можем опустить ветвление в положительном и отрицательном случае, как @ chepner предлагает с:

instance Show CountryCode where
    show (CountryCode x) = '+' : show x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...