2017-06-03 2 views
1

J'utilise GHC version 8.0.2 sur Windows 7, & module Debug.Trace. Dans la trace de la fonction parse ci-dessous, mon insertion ++ show first résultats dans l'erreur suivante:Lors du traçage dans Haskell, comment «afficher» une valeur dont le type de données n'est pas connu à la compilation?

  • Aucun cas pour (Show a) résultant d'une utilisation du 'show » possible Rectifier: add (Afficher un) au contexte de la signature de type pour: Parse :: Parser a -> String -> [(a, String)]
  • Dans le premier argument de (++)', namely montrent d'abord » Dans le deuxième argument de (++)', namely montrent d'abord ++ "," ++ show second ++ ")]" ' Dans le deuxième argument de (++)', namely "-> [(" ++ ++ montrer d'abord "" ++ montrer deuxième ++ ")]" »

Ma question: est-il un moyen de montrer le premier élément de la paire ordonnée (a,String) même si son type n'est pas connu à la compilation?

Mon code source est indiqué ci-dessous:

{-# LANGUAGE MonomorphismRestriction #-} 

import Data.Typeable 
import Data.Char 
import Debug.Trace 

newtype Parser a = P (String -> [(a,String)]) 

parse :: Parser a -> String -> [(a,String)] 
parse (P p) input | trace 
    (let result = (p input) 
     element = head result 
     first = fst element 
     second = snd element 
    in ("parse maps " ++ input ++ " -> [(" ++ show first ++ "," ++ show second ++ ")]") 
) False = undefined 
parse (P p) input = p input 

nextChar :: Parser Char 
nextChar = P (\input -> case input of { [] -> [] ; (c:cs) -> [(c,cs)] }) 

J'espère retracer l'évaluation des parse nextChar "ABCD".

+4

Que se passe-t-il si 'a' est effectivement un type non affichable? Soit vous ajoutez une contrainte 'Show', soit vous évitez d'imprimer' first'. Eventuellement, le suffixe 'input' sans le suffixe' second' est déjà une bonne représentation de 'first', de toute façon. – chi

+1

Pas avec 'Debug.Trace', et je ne suis pas au courant des modules qui peuvent le faire (ce serait très difficile à implémenter, car nous devrions fabriquer des dictionnaires' Show' avec très peu d'informations - les types ne sont pas stocké à l'exécution). Mais vous voudrez peut-être vérifier les fonctionnalités de débogage de ['ghci'] (https://downloads.haskell.org/~ghc/7.4.1/docs/html/users_guide/ghci-debugger.html). – luqui

Répondre

2

Oui, bien sûr, il suffit de suivre les instructions de l'erreur:

parse :: Show a => Parser a -> String -> [(a,String)] 

Une fois que vous avez terminé le débogage, vous pouvez supprimer l'appel à trace et la contrainte Show; alors vous serez en mesure d'analyser à nouveau les choses utiles.

+0

Votre suggestion a fonctionné pour moi ... merci. ... 'ghci my_script.hs ... * Principal> analyser nextChar" ABCD " analyser les cartes ABCD -> [('A'," BCD ")] [('A'," BCD ")]' –