首页 文章

GHCi中的多行命令

提问于
浏览
109

我在ghci中输入多行命令时遇到问题 .

以下2行代码适用于文件:

addTwo :: Int -> Int -> Int
addTwo x y = x + y

但是当我进入ghci时,我收到一个错误:

<interactive>:1:1: error:
    Variable not in scope: addTwo :: Int -> Int -> Int

我也尝试将代码放在 :{ ... :} 中,但是它们也不适用于这个例子,因为这只是将这些行附加到一行,但情况并非如此 .

我使用的是WinGHCi,版本2011.2.0.1

4 回答

  • 13

    大多数情况下,您可以依靠类型推断来为您制作签名 . 在您的示例中,以下内容就足够了:

    Prelude> let addTwo x y = x + y
    

    如果您确实需要带有类型签名的定义,或者您的定义跨越多行,则可以在ghci中执行此操作:

    Prelude> :{
    Prelude| let addTwo :: Int -> Int -> Int
    Prelude|     addTwo x y = x + y 
    Prelude| :}
    Prelude> addTwo 4 7
    11
    

    请注意,您也可以将其挤压到一行:

    Prelude> let addTwo :: Int -> Int -> Int ; addTwo x y = x + y
    

    您可以在文档的Interactive evaluation at the prompt部分找到有关与ghci交互的更多信息 .

  • 94

    通过激活GHCI并键入 :set +m 来解决此问题:

    Prelude> :set +m
    Prelude> let addTwo :: Int -> Int -> Int
    Prelude|     addTwo x y = x + y
    Prelude| 
    Prelude> addTwo 1 3
    4
    

    繁荣 .


    什么's going on here (and I'主要与 you 谈论,在通过Learn You A Haskell工作时谷歌搜索帮助的人是GHCI是一个交互式环境,您可以动态更改功能名称的绑定 . 您必须将函数定义包装在 let 块中,以便Haskell知道您将要定义某些内容 . :set +m 东西是多行 :{ 代码 :} 构造的简写 .

    空格在块中也很重要,因此您必须在类型定义之后将函数定义缩进四个空格以考虑 let 中的四个空格 .

  • 1

    使用 let

    Prelude> :{
    Prelude| let addTwo :: Int -> Int -> Int
    Prelude|     addTwo x y = x + y
    Prelude| :}
    Prelude> addTwo 2 3
    5
    
  • 153

    GHCI version 8.0.1开始,不再需要 let 来定义REPL上的函数 .

    所以这应该适合你:

    λ: addTwo x y = x + y
    λ: addTwo 1 2
    3
    λ: :t addTwo
    addTwo :: Num a => a -> a -> a
    

    Haskell的类型推断提供了适用于浮点数的通用类型:

    λ: addTwo 2.0 1.0
    3.0
    

    如果你必须提供自己的打字,似乎你需要使用 let 结合多行输入(使用 :set +m 来启用GHCI中的多行输入):

    λ: let addTwo :: Int -> Int -> Int
     |     addTwo x y = x + y
     | 
    λ: addTwo 1 2
    3
    

    但是如果因为你的非多态类型输入而试图传递除了_2656544之外的任何东西,你会得到错误:

    λ: addTwo 2.0 1.0
    
    <interactive>:34:8: error:
        • No instance for (Fractional Int) arising from the literal ‘2.0’
        • In the first argument of ‘addTwo’, namely ‘2.0’
          In the expression: addTwo 2.0 1.0
          In an equation for ‘it’: it = addTwo 2.0 1.0
    

相关问题