在Haskell的解释器中定义函数签名GHCi不起作用。从this page复制示例:
Prelude> square :: Int -> Int
<interactive>:60:1: error:
• No instance for (Show (Int -> Int)) arising from a use of ‘print’
(maybe you haven't applied a function to enough arguments?)
• In a stmt of an interactive GHCi command: print it
Prelude> square x = x * x
如何声明函数签名然后以交互方式在Haskell中提供函数定义?另外:为什么我不能简单地评估函数并在定义函数后查看其类型(例如Prelude> square
)?
答案 0 :(得分:12)
您可以在ghc
交互式shell中定义函数签名。但问题是你需要在一个命令中定义函数。
您可以使用分号(;
)分割两部分:
Prelude> square :: Int -> Int; square x = x * x
请注意,对于具有多个子句的函数,情况也是如此。如果你写:
Prelude> is_empty [] = True
Prelude> is_empty (_:_) = False
您实际上已使用第二个语句覆盖了之前的is_empty
函数。如果我们用空列表查询,我们得到:
Prelude> is_empty []
*** Exception: <interactive>:4:1-22: Non-exhaustive patterns in function is_empty
因此ghci
将最后一个定义作为单个子句函数定义。
你必须再写一次:
Prelude> is_empty[] = True; is_empty (_:_) = False
答案 1 :(得分:8)
多行输入需要包含在:{
和:}
命令中。
λ> :{
> square :: Int -> Int
> square x = x * x
> :}
square :: Int -> Int
答案 2 :(得分:4)
以下是三种方式:
>>> square :: Int -> Int; square = (^2)
>>> let square :: Int -> Int
... square = (^2)
...
>>> :{
... square :: Int -> Int
... square = (^2)
... :}
第二个要求你:set +m
;我将其包含在我的~/.ghci
中,以便始终打开。