Haskell: показ и пример с красивой печатью - PullRequest
2 голосов
/ 21 ноября 2011

Я начал изучать интеллектуальные системы в университете, и наш родной язык - Хаскель.Я должен признать, что я не очень знаком с этим до сих пор.Частью задачи этой недели является разработка алгебраического типа данных Expr a, который представляет основные арифметические операции (+,-,*,/).

Решение IMO должно быть:

module Expression where

    data Expr a = Number a |
    Var |
    Sum (Expr a) (Expr a) |
    Prod (Expr a) (Expr a) |
    Div (Expr a) (Expr a) |
    Pot (Expr a) a
            deriving (Show)     

Хорошо, пока.Задача состоит в том, чтобы сейчас реализовать симпатичный экземпляр для нашей функции.то есть:

от

Plus ( Pot ( Var 2)) ( Num 3)

до

x^2 + 3

Итак, я понятия не имел, что такое "красивая"средства.После поиска в интернете я обнаружил, что «довольно» означает переписать вывод только в удобочитаемой форме.Это правильно?Если это так, что это значит для моей функции?Должен ли я заменить функцию show на функцию pretty?Я действительно не знаю, с чего начать.

Я прочитал несколько подобных вопросов здесь, но не понял суть там.Я был бы очень рад, если бы кто-нибудь дал мне несколько советов, советов, решений или чего-то еще!

Ответы [ 2 ]

5 голосов
/ 21 ноября 2011

Да, вот что значит симпатичная печать.

По сути, вам просто нужна функция, которая преобразует Expr a в String:

myPrettyPrint :: Expr a -> String

Называйте это как хотите, и не пытайтесь заменить show.

Чтобы реализовать эту функцию, вы, вероятно, захотите узнать о сопоставлении с образцом .

1 голос
/ 21 ноября 2011

Я бы просто реализовал show соответственно (вместо того, чтобы выводить из него), что можно сделать довольно легко, по крайней мере, если вы не возражаете против включения ненужных скобок:

instance (show a) => show (Expr a) where
  show (Number x) = show x
  -- ...
  show (Prod x y) = "("++show x++")*("++show y++")"
  -- ...

Это можно сделать лучше и эффективнее, но, возможно, этого решения вам достаточно.


В комментариях выше было сказано, что show должен быть легковесным средством сериализации и, в частности, должен удовлетворять (read . show) x = x. Я согласен, и это означает, что вы не должны, например, делать какие-либо реальные вещи с надписью prettyprint (например, вывод в LaTeX, что, безусловно, будет хорошим способом вывода таких данных). IMO означает, что не означает, что show всегда должен вести себя как производный экземпляр, не если этот вывод ненадежно менее читабелен, длиннее и / или менее четок, если просматривается без кода haskell в качестве контекста.


Еще один пункт Хаммара, сделанный в комментариях выше: вывод show должен быть действительным кодом haskell. Чтобы мое решение соответствовало этому, вам нужно сделать Expr экземпляром Num и Fractional или Integral.

...