У меня есть следующий тип данных:

data Ops = Add | Sub | Mul | Div | Mod

И эта функция:

charToOp :: Char -> Ops
charToOp x 
      | x == '+' = Add
      | x == '-' = Sub
      | x == '*' = Mul
      | x == '/' = Div
      | x == '%' = Mod

В GHCI, если я попробую charToOp '+', я получу следующее сообщение:

*** No instance for (Show Ops) arising from a use of `print'
    * In a stmt of an interactive GHCi command: print it**.

Как это исправить?

0
mil236 5 Апр 2020 в 02:09

1 ответ

Для вашего типа данных нет экземпляра Show, попробуйте добавить следующее:

data Ops = Add | Sub | Mul | Div | Mod deriving (Show)

Теперь это работает:

*Main> charToOp '-'
Sub

Кроме того, вы также можете создать свой собственный экземпляр Show

Боковое примечание: вы можете использовать сопоставление с образцом вместо охранников.

charToOp :: Char -> Ops
charToOp x = case x of
    '+' -> Add
    '-' -> Sub
    '*' -> Mul
    '/' -> Div
    '%' -> Mod
4
Meowcolm Law 5 Апр 2020 в 02:24