Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 在GHCi中定义函数签名_Haskell_Ghci - Fatal编程技术网

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交互式

在Haskell的解释器GHCi中定义函数签名不起作用。从以下位置复制示例:

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)
... :}