Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

prettyPrint doesn't respect pattern matching #24

Open
david-hoze opened this issue Nov 8, 2015 · 1 comment
Open

prettyPrint doesn't respect pattern matching #24

david-hoze opened this issue Nov 8, 2015 · 1 comment

Comments

@david-hoze
Copy link

Hi, I have the following code in one of my diagrams in latex:

import Diagrams.TwoD.Text

superScript c = case c of
            '0' -> '\x2070'
            '1' -> '\xb9'
            '2' -> '\xb2'
            '3' -> '\xb3'
            '4' -> '\x2074'
            '5' -> '\x2075'
            '6' -> '\x2076'
            '7' -> '\x2077'
            '8' -> '\x2078'
            '9' -> '\x2079'
            '+' -> '\x207A'
            '-' -> '\x207B'
            '=' -> '\x207C'
            '(' -> '\x207D'
            ')' -> '\x207E'
            'i' -> '\x2071'
            'n' -> '\x207F'
            otherwise -> c

format ('^':'-':d:chars) = [superScript '-',superScript d] ++ format chars
format ('^':d:chars) = [superScript d] ++ format chars
format (c:chars) = [c] ++ format chars
format [] = []

dia = text (format "A^-3d^2+3A^-1d+3A") # scale 0.2 <> strutX (7)

which doesn't render the diagram at all.
I checked the diagrams-builder-cairo's temporary haskell file, and found that it didn't translate the format function's pattern matching as expected:

{-# LANGUAGE NoMonomorphismRestriction, TypeFamilies,
  FlexibleContexts #-}
module Diagram1804289383846930886 where
import Diagrams.Prelude
import Diagrams.Backend.Cairo
import Diagrams.TwoD.Text
superScript c
  = case c of
        '0' -> '\8304'
        '1' -> '\185'
        '2' -> '\178'
        '3' -> '\179'
        '4' -> '\8308'
        '5' -> '\8309'
        '6' -> '\8310'
        '7' -> '\8311'
        '8' -> '\8312'
        '9' -> '\8313'
        '+' -> '\8314'
        '-' -> '\8315'
        '=' -> '\8316'
        '(' -> '\8317'
        ')' -> '\8318'
        'i' -> '\8305'
        'n' -> '\8319'
        otherwise -> c
format ((('^' : '-') : d) : chars)
  = [superScript '-', superScript d] ++ format chars
format (('^' : d) : chars) = [superScript d] ++ format chars
format (c : chars) = [c] ++ format chars
format [] = []
dia = text (format "A^-3d^2+3A^-1d+3A") # scale 0.2 <> strutX (7)

which in turn causes the following error message (it actually produces something cryptic, see #23):

bug.hs:27:17:
    Couldn't match expected type ‘[Char]’ with actual type ‘Char’
    In the pattern: '-'
    In the pattern: '^' : '-'
    In the pattern: ('^' : '-') : d

bug.hs:28:35:
    Couldn't match expected type ‘Char’ with actual type ‘[[Char]]’
    In the first argument of ‘superScript’, namely ‘d’
    In the expression: superScript d

bug.hs:29:10:
    Couldn't match expected type ‘[Char]’ with actual type ‘Char’
    In the pattern: '^'
    In the pattern: '^' : d
    In the pattern: ('^' : d) : chars

bug.hs:29:43:
    Couldn't match expected type ‘Char’ with actual type ‘[[Char]]’
    In the first argument of ‘superScript’, namely ‘d’
    In the expression: superScript d

bug.hs:30:23:
    Couldn't match expected type ‘Char’ with actual type ‘[[Char]]’
    In the expression: c
    In the first argument of ‘(++)’, namely ‘[c]’

bug.hs:32:20:
    Couldn't match type ‘Char’ with ‘[[Char]]’
    Expected type: [[[Char]]]
      Actual type: [Char]
    In the first argument of ‘format’, namely ‘"A^-3d^2+3A^-1d+3A"’
    In the first argument of ‘text’, namely
      ‘(format "A^-3d^2+3A^-1d+3A")’
    In the first argument of ‘(#)’, namely
      ‘text (format "A^-3d^2+3A^-1d+3A")’

If I replace it by explicitly writing down the parenthesis precedence like so:

\begin{diagram}[width=400,height=75]
import Diagrams.TwoD.Text

superScript c = case c of
            '0' -> '\x2070'
            '1' -> '\xb9'
            '2' -> '\xb2'
            '3' -> '\xb3'
            '4' -> '\x2074'
            '5' -> '\x2075'
            '6' -> '\x2076'
            '7' -> '\x2077'
            '8' -> '\x2078'
            '9' -> '\x2079'
            '+' -> '\x207A'
            '-' -> '\x207B'
            '=' -> '\x207C'
            '(' -> '\x207D'
            ')' -> '\x207E'
            'i' -> '\x2071'
            'n' -> '\x207F'
            otherwise -> c

format ('^':('-':(d:(chars)))) = [superScript '-',superScript d] ++ format chars
format ('^':(d:chars)) = [superScript d] ++ format chars
format (c:chars) = [c] ++ format chars
format [] = []

dia = text (format "A^-3d^2+3A^-1d+3A") # scale 0.2 <> strutX (7)

it works fine.

Here is a latex document with both examples:

% Created 2015-11-08 Sun 03:21
\documentclass[11pt]{article}
\tolerance=1000
\usepackage{amsmath}
\usepackage[backend=cairo, extension=pdf, outputdir=diagrams]{/home/amitai/github/haskell/diagrams/diagrams-builder/latex/diagrams-latex}
\usepackage{graphicx}
\author{Amitai Hoze}
\date{\today}
\title{Bug reproduction}
\begin{document}

\maketitle


\section{Reproducing the bug}
\label{sec:orgheadline1}
\begin{diagram}[width=400,height=75]
import Diagrams.TwoD.Text

superScript c = case c of
            '0' -> '\x2070'
            '1' -> '\xb9'
            '2' -> '\xb2'
            '3' -> '\xb3'
            '4' -> '\x2074'
            '5' -> '\x2075'
            '6' -> '\x2076'
            '7' -> '\x2077'
            '8' -> '\x2078'
            '9' -> '\x2079'
            '+' -> '\x207A'
            '-' -> '\x207B'
            '=' -> '\x207C'
            '(' -> '\x207D'
            ')' -> '\x207E'
            'i' -> '\x2071'
            'n' -> '\x207F'
            otherwise -> c

format ('^':'-':d:chars) = [superScript '-',superScript d] ++ format chars
format ('^':d:chars) = [superScript d] ++ format chars
format (c:chars) = [c] ++ format chars
format [] = []

dia = text (format "A^-3d^2+3A^-1d+3A") # scale 0.2 <> strutX (7)
\end{diagram}

\section{Temporary fix}
\label{sec:orgheadline2}
\begin{diagram}[width=400,height=75]
import Diagrams.TwoD.Text

superScript c = case c of
            '0' -> '\x2070'
            '1' -> '\xb9'
            '2' -> '\xb2'
            '3' -> '\xb3'
            '4' -> '\x2074'
            '5' -> '\x2075'
            '6' -> '\x2076'
            '7' -> '\x2077'
            '8' -> '\x2078'
            '9' -> '\x2079'
            '+' -> '\x207A'
            '-' -> '\x207B'
            '=' -> '\x207C'
            '(' -> '\x207D'
            ')' -> '\x207E'
            'i' -> '\x2071'
            'n' -> '\x207F'
            otherwise -> c

format ('^':('-':(d:(chars)))) = [superScript '-',superScript d] ++ format chars
format ('^':(d:chars)) = [superScript d] ++ format chars
format (c:chars) = [c] ++ format chars
format [] = []

dia = text (format "A^-3d^2+3A^-1d+3A") # scale 0.2 <> strutX (7)
\end{diagram}
\end{document}

versions used
diagrams-builder: 0.7.2.0
ghc: 7.10.2
diagrams-core: 1.3.0.3
diagrams-cairo: 1.3.0.5
NixOS: NixOS/nixpkgs@819a375

david-hoze pushed a commit to david-hoze/DQC1-Computational-Power that referenced this issue Nov 8, 2015
@byorgey
Copy link
Member

byorgey commented Nov 9, 2015

Thanks for the report! Do you know what version of haskell-src-exts this was built with?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants