2015-10-22 11 views
6

Per insegnare Haskell ai principianti utilizzando la versione recente di GHC, i tipi di alcune funzioni possono confondere a causa del Foldable-Traversable-in-Prelude (FTP). Ad esempio, le funzioni di base su elenchi come length, sum e product hanno tipi che includono il vincolo Foldablefoldr :: Foldable t => (a -> b -> b) -> b -> t a -> b. Allo stesso modo per alcune funzioni introduttive di ordine superiore, ad es. foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b.Creazione di GHC su FTP pre-FTP

Che cos'è un modo leggero per abilitare temporaneamente il comportamento pre-FTP? Quindi i principianti possono ancora godere di tutti i vantaggi di un GHC recente e non devono ricorrere al tentativo di installare versioni precedenti o utilizzare gli Hug (ad esempio, come suggerito per l'edizione 2015 di edX FP101x).

+1

Perché non utilizzare solo GHC 7.8? Usando gli abbracci non raccomanderei lo – jberryman

+2

Sono d'accordo che non consiglierei gli abbracci. Tuttavia, dal momento che l'utilizzo di GHC 7.10 e versioni successive presenta anche soluzioni abbastanza semplici, non consiglierei GHC 7.8. – algotrific

+1

Suppongo che avrei dovuto chiedere: cosa ti fa desiderare 7.10 per insegnare? Sono entrambi fantastici compilatori, supportati da stack lts, ​​ugualmente facili da installare, ecc. In realtà non ci sono problemi con gli ultimi 7.10 su Mac? – jberryman

risposta

9

che potrebbe funzionare bene, ma abbiamo deciso di andare con qualcosa di meno noioso per http://haskellbook.com/, quello che abbiamo fatto è stato ci ha spiegato cosa è cambiato e mostrare loro come si potrebbe affermare il tipo di lista.

Prelude> :t length 
length :: Foldable t => t a -> Int 
Prelude> :t length :: [a] -> Int 
length :: [a] -> Int 

Tra questo e il tipo affermato negli esempi & esercizi, questo è sufficiente e se incontrano accidentalmente un tipo con pieghevole in essa, non provoca problemi perché abbiamo detto loro come le cose sono cambiate.

Rendendoli importare cose e non preoccuparsi di dire loro quello che è successo sembra fragile, in quanto si confondono se scendono dalla strada felice.

7

Una possibilità dimostrato come segue:

$ ghci 
Prelude> import Prelude hiding (length, sum, product, foldr, foldl, and, or, any, all) 
Prelude> import GHC.OldList 
Prelude GHC.OldList> 

Poi si arriva ai vecchi tipi per tutto ciò che è stato nascosto, per esempio

length :: [a] -> Int 
sum :: Num a => [a] -> a 
product :: Num a => [a] -> a 
foldr :: (a -> b -> b) -> b -> [a] -> b 
foldl :: (b -> a -> b) -> b -> [a] -> b 
and :: [Bool] -> Bool 
any :: (a -> Bool) -> [a] -> Bool 
all :: (a -> Bool) -> [a] -> Bool 
+3

o, meglio ancora: definisci il tuo comppat. modulo basato sulla risposta di bitemyapp, e fagli vedere e capire il suo contenuto. –