让 GHC post FTP 感觉比 FTP
Making GHC post FTP feel pre-FTP
对于使用最新版本 GHC 的初学者Haskell,由于 Foldable-Traversable-in-Prelude (FTP),某些函数的类型可能会造成混淆。例如,length
、sum
和 product
等列表中的基本函数具有包含 Foldable
约束 foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
的类型。同样对于一些介绍性的高阶函数,例如foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b
.
临时启用 FTP 前行为的轻量级方法是什么?然后初学者仍然可以享受最新 GHC 的所有好处,而不必尝试安装旧版本或使用 Hugs(例如,建议使用 edX 的 FP101x 2015 版)。
一个选项演示如下:
$ 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
这可以很好地工作,但我们决定为 http://haskellbook.com/ 做一些不那么乏味的事情,我们所做的是解释发生了什么变化,并向他们展示如何断言基于列表的类型。
Prelude> :t length
length :: Foldable t => t a -> Int
Prelude> :t length :: [a] -> Int
length :: [a] -> Int
在示例和练习中断言的类型之间,这已经足够了,如果他们不小心遇到其中包含 Foldable 的类型,也不会造成麻烦,因为我们已经告诉他们事情是如何改变的。
让他们输入东西而不费心告诉他们发生了什么似乎很脆弱,因为如果他们偏离了快乐的道路,他们会感到困惑。
对于使用最新版本 GHC 的初学者Haskell,由于 Foldable-Traversable-in-Prelude (FTP),某些函数的类型可能会造成混淆。例如,length
、sum
和 product
等列表中的基本函数具有包含 Foldable
约束 foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
的类型。同样对于一些介绍性的高阶函数,例如foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b
.
临时启用 FTP 前行为的轻量级方法是什么?然后初学者仍然可以享受最新 GHC 的所有好处,而不必尝试安装旧版本或使用 Hugs(例如,建议使用 edX 的 FP101x 2015 版)。
一个选项演示如下:
$ 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
这可以很好地工作,但我们决定为 http://haskellbook.com/ 做一些不那么乏味的事情,我们所做的是解释发生了什么变化,并向他们展示如何断言基于列表的类型。
Prelude> :t length
length :: Foldable t => t a -> Int
Prelude> :t length :: [a] -> Int
length :: [a] -> Int
在示例和练习中断言的类型之间,这已经足够了,如果他们不小心遇到其中包含 Foldable 的类型,也不会造成麻烦,因为我们已经告诉他们事情是如何改变的。
让他们输入东西而不费心告诉他们发生了什么似乎很脆弱,因为如果他们偏离了快乐的道路,他们会感到困惑。