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

Toy*_*rii 7 haskell strong-typing

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

现在的问题是我的代码库不断增长,只要我改变了一件事,我的代码就会在整个地方发生故障,并且我会跟踪所有问题.

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

Dan*_*ton 7

现在的问题是我的代码库不断增长,只要我改变了一件事,我的代码就会在整个地方发生故障,并且我会跟踪所有问题.

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

/blog/#String         BlogR   GET
Run Code Online (Sandbox Code Playgroud)

我决定将其改为

/blog/#Date/#String   BlogR   GET
Run Code Online (Sandbox Code Playgroud)

一旦我对路由进行了这一更改,编译器就会告诉我我到处都破坏了我的代码.我将被迫更新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
Run Code Online (Sandbox Code Playgroud)

有时候ghci会选择烦人的默认值.然而,这可以减轻.

ghci> :set -XNoMonomorphismRestriction
ghci> let shew = show
ghci> :t shew
shew :: Show a => a -> String
Run Code Online (Sandbox Code Playgroud)

虽然使用ghci来发现函数的类型对初学者来说很好,但我不建议依赖 ghci.了解签名类型的含义,以及如何自己发现它们.事实上,首先编写一个函数,首先编写你想要的类型签名.学习这项技能只需要很少的时间,当您可以使用Haskell的类型系统时,编程是一个很大的好处.