使用 GHCi 时如何为函数提供显式类型声明?
如何在 GHCi 中定义此函数的等效项(取自 learnyouahaskell)?
import Data.List
numUniques :: (Eq a) => [a] -> Int
numUniques = length . nub
如果没有类型声明,GHCi 会接受函数定义,但最终会得到一个无用的类型:
Prelude Data.List> import Data.List
Prelude Data.List> let numUniques' = length . nub
Prelude Data.List> :t numUniques'
numUniques' :: [()] -> Int
生成的函数仅接受单位列表作为参数。
有没有办法在 GHCi 中提供类型声明?或者是否有另一种方法来定义不需要类型声明的函数?
我在 GHCi 指南中没有看到明显的线索,并尝试了如下的表达式(无济于事):
> let numUniques' = ((length . nub) :: (Eq a) => [a] -> Int)
> :t numUniques'
numUniques' :: [()] -> Int
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您使用
-XNoMonomorphismRestriction
关闭单态限制,它将推断出正确的类型。If you turn off the monomorphism restriction with
-XNoMonomorphismRestriction
, it will infer the right type.GHC 用户指南显示了实现此目的的另外两种方法。 本小节 引入了
:{
...:}
构造,可以按如下方式使用:或者,您可以启用 多行模式:
The GHC User's Guide shows two additional ways to achieve this. This subsection introduces the
:{
...:}
construct, which can be used as follows:Alternatively, you can enable multiline mode:
请注意,您还可以通过将“点”(即显式变量)添加回表达式来避免单态性限制。所以这也给出了正确的类型:
Note that you can also avoid the monomorphism restriction simply by adding "points" (i.e. explicit variables) back to your expression. So this also gives the correct type: