为了账号安全,请及时绑定邮箱和手机立即绑定

GHCi中的多行命令

GHCi中的多行命令

慕沐林林 2019-12-21 11:31:47
我在ghci中输入多行命令时遇到问题。以下两行代码可从文件运行:addTwo :: Int -> Int -> IntaddTwo x y = x + y但是当我输入ghci时,出现错误:<interactive>:1:1: error:    Variable not in scope: addTwo :: Int -> Int -> Int我也尝试将代码放入:{ ... :},但它们也不适用于本示例,因为这只是将行追加到一行中,事实并非如此。我正在使用WinGHCi,版本2011.2.0.1
查看完整描述

3 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

大多数时候,您可以依靠类型推断来为您确定签名。在您的示例中,以下足够了:


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

您可以在文档提示部分的“ 交互评估”中找到有关与ghci交互的更多信息。


查看完整回答
反对 回复 2019-12-21
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

通过启动GHCI并输入:set +m以下命令来解决此问题:


Prelude> :set +m

Prelude> let addTwo :: Int -> Int -> Int

Prelude|     addTwo x y = x + y

Prelude| 

Prelude> addTwo 1 3

4

繁荣。


这里发生的事情(我主要是在和您聊天,在通过“ 了解您的Haskell”工作时,正在谷歌上寻求帮助的人)是GHCI是一个交互式环境,您可以在其中动态更改函数名称的绑定。您必须将函数定义包装在一个let块中,以便Haskell知道您将要定义一些内容。这些:set +m东西是多行:{ 代码 :}构造的简写。


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


查看完整回答
反对 回复 2019-12-21
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

从GHCI版本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

但是,如果Int由于非多态输入而尝试传递除a以外的任何内容,则会出现错误:


λ: 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


查看完整回答
反对 回复 2019-12-21
  • 3 回答
  • 0 关注
  • 603 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信