2015-10-22 1 views
6

Для обучения Haskell начинающим пользователям с использованием последней версии GHC типы некоторых функций могут сбивать с толку из-за Foldable-Traversable-in-Prelude (FTP). Например, основные функции в списках, такие как length, sum и product, имеют типы, которые включают ограничение Foldablefoldr :: Foldable t => (a -> b -> b) -> b -> t a -> b. Аналогично для некоторых вводных функций более высокого порядка, например. foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b.Создание почтового FTP-сервера GHC pre-FTP

Что такое легкий способ временного включения режима pre-FTP? Тогда новички могут по-прежнему пользоваться всеми преимуществами недавнего GHC и не должны прибегать к попытке установить более старые версии или использовать Hugs (например, как предложено для версии edP версии FP101x 2015).

+1

Почему бы просто не использовать GHC 7.8? Использование объятий я бы не рекомендовал – jberryman

+2

Я согласен с тем, что не рекомендую Hugs. Но, поскольку использование GHC 7.10 и более поздних версий также имеет довольно простые обходные пути, я бы не рекомендовал GHC 7.8. – algotrific

+1

Думаю, я должен был спросить: что заставляет вас хотеть 7.10 для обучения? Они оба отличные компиляторы, поддерживаемые stackage lts, ​​одинаково просты в установке и т. Д. На самом деле, нет проблем с последними 7.10 на macs? – jberryman

ответ

9

Это может работать хорошо, но мы решили пойти с чем-то менее утомительным для http://haskellbook.com/, что мы сделали, мы объяснили, что изменилось, и показать им, как вы могли бы утверждать список на основе типа.

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

Между тем и типов утверждал в примерах & упражнений, это достаточно, и если они случайно сталкиваются типа с Складная в нем, это не вызывает проблем, потому что мы сказали им, как все изменилось.

Заставить их импортировать вещи и не потрудиться рассказать им, что произошло, кажется хрупким, так как они смущаются, если они сойдут с счастливого пути.

7

Один из вариантов продемонстрированы следующим образом:

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

Тогда вы получите старые типы для всего, что было скрыто, например,

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

или еще лучше: определите свою собственную копию. модуль, основанный на ответе bitemyapp, и позволяет им видеть и понимать его содержимое. –