2012-05-11 13 views
5

Attualmente sto cercando di scrivere una piccola istanza Show per le funzioni aritmetiche primitive.Istanza Mostra per la funzione

Obiettivo per creare un elenco di funzioni visualizzabili.

La funzione molto semplice per lo show sembra che:

showOp :: (Int -> Int -> Int) -> String 
    showOp op 
    | op 3 3 == 6 = "plus" 
    | op 3 3 == 0 = "minus" 
    | op 3 3 == 9 = "times" 
    | op 3 3 == 1 = "divide" 
    | otherwise = "undefined" 

Ma io non può ottenere un'istanza di Show for (int -> int -> Int). Ho provato così:

instance Show (Int -> Int -> Int) where 
    show op = show "asdf" 

Ma non funziona. WinHugs restituisce semplicemente l'errore

Syntax error in instance head (variable expected) 

È possibile definire anche Mostra per le funzioni? Se lo è, come potrei affrontare quel problema?

risposta

6

Non utilizzare WinHugs. Usa GHC.

Infatti nelle recenti versioni della piattaforma Haskell esiste già un'istanza di funzioni per Show.

Prelude Text.Show.Functions> show (+1) 
"<function>" 
Prelude Text.Show.Functions> show (\x -> x ++ "foo") 
"<function>" 

Ora, nel tuo caso, tuttavia, è necessario -XFlexibleInstances in poi, dal momento che l'istanza non è di forma (Constructor a1 .. an) dove a1 .. un sono variabili di tipo distinte.

Accenderlo con {-# LANGUAGE FlexibleInstances #-}

+0

Detto questo, non è possibile definire "Mostra" per fornire effettivamente maggiori dettagli sulla funzione. –

+1

Sicuro che lo sia. Può mostrare il tipo (dato via Typeable); oppure può mostrare alcuni degli ingressi e delle uscite (come avviene in QuickCheck). –

+0

... Sì. Va bene. Scusate. Tuttavia, non può mostrare l'implementazione o il nome. –

3

(Questa non è una risposta (di Don copre esso), ma è troppo lungo per un commento)

Il codice ha un sacco di logica ripetute (specificamente op 3 3 == si verifica molto), ma c'è via per rendere questo detergente: case expressions. Questo ci consente di calcolare op 3 3 una volta e poi di gestire i vari casi (esattamente come la corrispondenza dei pattern nelle definizioni delle funzioni).

showOp op = case op 3 3 of 
       6 -> "plus" 
       0 -> "minus" 
       9 -> "times" 
       1 -> "divide" 
       _ -> "undefined" 
1

È anche possibile utilizzare gli abbracci.

Start Hugs con hugs -98 +o o runhugs -X-98 +o e utilizzare {-# LANGUAGE FlexibleInstances #-} nel file di origine.

Problemi correlati