使用GHCi时如何为函数提供显式类型声明?

mat*_*tbh 72 haskell types ghci function-declaration

如何在GHCi中定义此函数的等价物(取自learnyouahaskell)?

import Data.List  

numUniques :: (Eq a) => [a] -> Int  
numUniques = length . nub  
Run Code Online (Sandbox Code Playgroud)

如果没有类型声明,GHCi会接受函数定义,但最终会出现无用的类型:

Prelude Data.List> import Data.List 
Prelude Data.List> let numUniques' = length . nub
Prelude Data.List> :t numUniques'
numUniques' :: [()] -> Int
Run Code Online (Sandbox Code Playgroud)

结果函数仅接受单位列表作为参数.

有没有办法在GHCi中提供类型声明?或者是否有另一种方法来定义这些不需要类型声明的函数?

我在GHCi指南中没有看到明显的线索,并尝试了以下表达式(无济于事):

> let numUniques' = ((length . nub) :: (Eq a) => [a] -> Int)
> :t numUniques'
numUniques' :: [()] -> Int
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 93

有没有办法在GHCi中提供类型声明?

let numUniques' :: (Eq a) => [a] -> Int; numUniques' = length . nub
Run Code Online (Sandbox Code Playgroud)

或者是否有另一种方法来定义这些不需要类型声明的函数?

如果你关闭单态限制-XNoMonomorphismRestriction,它将推断出正确的类型.

  • 我还没有单形态,但通常这个答案指出我使用分号将GHCi中的定义组合在一起 - 教程是在.hs文件中编写的,在GHCi中尝试时会产生许多不同的问题(函数缺乏绑定等) ). (3认同)

scl*_*clv 13

请注意,您还可以通过将"点"(即显式变量)添加回表达式来避免单态限制.所以这也给出了正确的类型:

让numUniques x =长度.nub $ x


Rei*_*eek 5

GHC 用户指南显示了实现此目的的另外两种方法。本小节介绍:{...:}构造,它可以按如下方式使用:

> :{
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
| :}
Run Code Online (Sandbox Code Playgroud)

或者,您可以启用多行模式

> :set +m
> let
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
| 
Run Code Online (Sandbox Code Playgroud)