2013-03-31 19 views
9

In exercice scuolapattern matching in GHCi

ho questa funzione

bar :: Float -> Float -> Float 
bar x 0 = 0 
bar 0 y = 0 
bar x y = x * y 

tipo I in GHC come

let bar x 0 = 0; bar 0 y = 0; bar x y = x * y 

e valutare

bar foo 0 
bar 0 foo 

Sono ha chiesto di modificare la barra per usare '|' quindi voglio fare qualcosa di simile:

let bar x y = | x 0 = 0 | 0 y = 0 | x y = x * y 

ma in ghci ho ottenuto

parse error on input '=' 

Come posso farlo in GHCi? Il fatto di utilizzare la corrispondenza del modello ('|') cambierà qualcosa?

+1

La 'barra' originale utilizza la corrispondenza del modello.Vuoi conoscere [guards] (http://en.wikibooks.org/wiki/Haskell/Truth_values#Guards). – dave4420

+2

Potresti essere particolarmente intelligente e scrivere semplicemente 'lascia bar | altrimenti = (*) '... – leftaroundabout

+3

Rimuovi' = 'prima della prima guardia,' lascia bar x y | x == 0 = ... | y == 0 = ... | altrimenti = ... '. –

risposta

16

sguardo alla sintassi per l'utilizzo guardie:

bar x y | x == 0  = 0 
     | y == 0  = 0 
     | otherwise = x * y 

Scritto su una riga in GHCi:

let bar x y | x == 0 = 0 | y == 0 = 0 | otherwise = x * y 
9

utilizzare i file

Non digitare il codice direttamente nel ghci a meno che non sia davvero un one-liner.

Salvare il codice in un file di testo denominato PatternMatch.hs e caricarlo in ghci digitandolo.

:l PatternMatch.hs 

e poi se si apportano modifiche (e salvare) è possibile ricaricare il file in ghci digitando

:r 

alternativa, si potrebbe denominare i file dopo il quale esercitare cui si trovano, o semplicemente un Temp.hs di reusablle se è veramente un codice usa e getta.

Salvando materiale in un file di testo rendilo molto più facilmente modificabile e riutilizzabile.

Moduli

poi ti raccogliere funzioni connesse insieme tramite un modulo adeguato, in modo che possano essere importatore in altri programmi. Ad esempio, si potrebbe avere

module UsefulStuff where 

pamf = flip fmap 

salvati in un file chiamato UsefulStuff.hs e poi in un altro file si potrebbe

import UsefulStuff 

e quindi utilizzare le funzioni da UsefulStuff lì.

I moduli sono eccessivi per quello che stai facendo ora, ma ottenendo il flusso di lavoro di modifica, salvataggio, ricompilare, testare, ripetere, ti risparmierai da un bel po 'di sforzo.

+0

Benvenuti nel 21 ° secolo. I file appartengono a un cabinet con un manico in ottone. In questo giorno ed età in cui i fantastici bambini poggiano il loro codice in JSFiddle e saltano sul pulsante Run o si dilettano in una sandbox Swift per una gratificazione immediata, questa risposta non vincerà molti potenziali programmatori Haskell. I ragazzi veramente fantastici stanno probabilmente andando a [Shen] (http://www.shenlanguage.org/) dove possono avere tutte le programmazioni funzionali e il tipo che controlla la bontà che vogliono, e poi alcuni. E oh sì, ha una REPL che consente l'immissione su più righe "out of the box", digita le firme e tutto il resto. – ack

+1

@ack Penso che tu mi abbia scambiato per una persona a cui importa quello che fanno i ragazzi fantastici, mentre in realtà mi interessa solo aiutare le persone a ottenere il massimo dagli strumenti che uso anch'io. Grazie per lo spam su sham. – AndrewC

+0

Se ti interessa molto, forse potresti aver fatto riferimento a [questa risposta] (http://stackoverflow.com/a/8443096/588561), che non richiede l'uso di file. – ack