如何保持Haskell强大的打字灵活性?

时间:2012-02-10 06:10:43

标签: haskell strong-typing

我一直在Haskell中编写一个不断增长的代码库。我的问题是我根据GHCI告诉我应该的类型为函数添加了类型签名。

现在的问题是,我的代码库越来越多,只要我改变了一件事,我的代码就会遍布整个地方而且我会消耗掉跟踪所有问题。

通过在ghci中加载模块得出的类型是否过于具体?如何确定在我的签名中使用哪种类型或类型类以充分利用强类型的强大功能? (即不花一小时传播微小变化?)。

1 个答案:

答案 0 :(得分:7)

  

现在的问题是,我的代码库越来越多,只要我改变了一件事,我的代码就会遍布整个地方而且我会消耗掉跟踪所有问题。

这实际上是在Yesod(Haskell Web框架)中宣传为功能。假设我已经指定了以下路由规范:

/blog/#String         BlogR   GET

我决定将其改为

/blog/#Date/#String   BlogR   GET

一旦我对路由进行了这一更改,编译器就会告诉我每个地方都破坏了我的代码。我将被迫更新getBlogR函数 - 更改其输入类型,因此它也接受Date。我也将被迫更新我在模板中使用类型安全网址的任何地方,这看起来像@{BlogR (slug p)} - > @{BlogR (date p) (slug p)}

这被认为是 Good Thing ,因为类型检查器帮助您找到所做更改引入的问题。


现在,关于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的类型系统时,编程是一个很大的好处。