在GHCi中定义函数签名

时间:2017-07-27 23:12:45

标签: haskell ghci

在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)?

3 个答案:

答案 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中,以便始终打开。