Haskell 在GHCi中定义函数签名
在Haskell的解释器GHCi中定义函数签名不起作用。从以下位置复制示例:Haskell 在GHCi中定义函数签名,haskell,ghci,Haskell,Ghci,在Haskell的解释器GHCi中定义函数签名不起作用。从以下位置复制示例: Prelude>square::Int->Int :60:1:错误: •没有因使用“打印”而产生的(显示(Int->Int))实例 (可能您没有对足够的参数应用函数?) •在交互式GHCi命令的stmt中:打印它 前奏曲>方形x=x*x 如何声明函数签名,然后在Haskell中以交互方式给出函数定义?另外:为什么我不能在定义函数后简单地评估函数并查看其类型(例如,Prelude>square)呢?您可以在ghc交互式
Prelude>square::Int->Int
:60:1:错误:
•没有因使用“打印”而产生的(显示(Int->Int))实例
(可能您没有对足够的参数应用函数?)
•在交互式GHCi命令的stmt中:打印它
前奏曲>方形x=x*x
如何声明函数签名,然后在Haskell中以交互方式给出函数定义?另外:为什么我不能在定义函数后简单地评估函数并查看其类型(例如,
Prelude>square
)呢?您可以在ghc
交互式shell中定义函数签名。但是,问题是需要在单个命令中定义函数
您可以使用分号(;
)在两部分之间拆分:
Prelude> square :: Int -> Int; square x = x * x
实际上,您已经用第二条语句覆盖了前面的is_empty
函数。如果使用空列表进行查询,则会得到:
Prelude> is_empty []
*** Exception: <interactive>:4:1-22: Non-exhaustive patterns in function is_empty
多行输入需要包装在
:{
和:}
命令中
λ> :{
> square :: Int -> Int
> square x = x * x
> :}
square :: Int -> Int
这里有三种方法:
>>> square :: Int -> Int; square = (^2)
>>> let square :: Int -> Int
... square = (^2)
...
>>> :{
... square :: Int -> Int
... square = (^2)
... :}
第二个要求您
:设置+m
;我把它包括在我的~/.ghci
中,这样它就会一直打开。谢谢。快速的最后跟进:如果我在一行上定义它,为什么我不能在一行之后评估它Prelude>square
返回解析错误:需要模块头、导入声明或顶级声明。
完整跟踪:Prelude>square::Int->Int;square x=x*x Prelude>square:70:1:错误:•没有因使用“print”而产生的(Show(Int->Int))实例(可能您没有将函数应用到足够的参数?)•在交互式GHCi命令的stmt中:print it Prelude>square;;:71:1:错误:解析错误:需要模块头、导入声明或顶级声明。
@jll:但为什么还要编写两个附加分号?您可以使用例如square 3
计算一个正方形。square
出错的原因是因为它是一个函数,而Haskell(默认情况下)不能显示函数。这让我很困惑,因为我可以计算其他类型的实例,如1
,所以如果函数是第一类,为什么我不能计算函数并打印它的类型?我期望类似于square::Int->Int
as的东西output@jll:您可以使用:t
检查表达式的类型,因此:t square
可能存在重复
Prelude> is_empty[] = True; is_empty (_:_) = False
λ> :{
> square :: Int -> Int
> square x = x * x
> :}
square :: Int -> Int
>>> square :: Int -> Int; square = (^2)
>>> let square :: Int -> Int
... square = (^2)
...
>>> :{
... square :: Int -> Int
... square = (^2)
... :}