现在问题是我的代码库越来越大,只要我改变一件事情,我的代码就会到处出错,我不得不花费大量时间来追踪所有的问题。
在Yesod(一个Haskell web框架)中,这实际上被宣传为一种功能。假设我已经指定了以下路由规范:
/blog/#String BlogR GET
我决定将其更改为
/blog/#Date/#String BlogR GET
一旦我对路由进行了这个更改,编译器就会告诉我到处都破坏了我的代码。我将被迫更新
getBlogR
函数——改变其输入类型,使其也接受
Date
。我还将被迫更新在我的模板中使用类型安全URL的任何地方,这看起来像
@{BlogR (slug p)}
——>
@{BlogR (date p) (slug p)}
。
这被认为是一件好事,因为类型检查器正在帮助您找到由您所做的更改引入的问题。
现在,关于ghci。
ghci> let shew = show
ghci> :t shew
shew :: () -> String
ghci> :t show
show :: Show a => a -> String
有时候 ghci 选择的默认值可能会很烦人。不过您可以缓解这种情况。
ghci> :set -XNoMonomorphismRestriction
ghci> let shew = show
ghci> :t shew
shew :: Show a => a -> String
虽然使用ghci发现一个函数的类型对初学者来说是非常好的,但我不建议依赖于ghci。学习什么是类型签名,以及如何自己发现它们。事实上,开始编写一个函数时,先编写你想要的类型签名。花费一点时间学习这个技能是非常值得的,当您能够充分利用Haskell的类型系统时,它可以成为编程的很大助益。