2015-10-22 15 views
6

对于使用最近版本的GHC为初学者教授Haskell,某些功能的类型可能会因为可折叠可穿越前奏(FTP)而引起混淆。例如,列表上的基本功能(如lengthsumproduct)的类型包括Foldable约束foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b。对于一些介绍性的高阶功能,例如foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b制作GHC post FTP感受pre-FTP

什么是暂时启用FTP前行为的轻量级方式?然后初学者仍然可以享受最近的GHC的所有好处,并且不必诉诸试图安装旧版本或使用Hugs(例如edX的FP101x 2015版建议)。

+1

为什么不使用GHC 7.8?使用拥抱我不会推荐 – jberryman

+2

我同意我不会推荐拥抱。但是,由于使用GHC 7.10及更高版本也有相当简单的解决方法,我也不推荐GHC 7.8。 – algotrific

+1

我猜我应该问:你为什么要7.10教学?它们都是优秀的编译器,支持堆栈,易于安装等。实际上,在Mac上最新的7.10版本没有一些问题? – 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

或更好:定义你自己的comppat。基于bitemyapp的答案的模块,并让他们看到并理解其内容。 –