我在ghci中输入多行命令时遇到问题.
以下2行代码适用于文件:
addTwo :: Int -> Int -> Int
addTwo x y = x + y
Run Code Online (Sandbox Code Playgroud)
但是当我进入ghci时,我会遇到错误.
我也尝试将代码放在里面:{ ... :},但它们也不适用于这个例子,因为这只是将行追加到一行,但不应该是这样.
我使用的是WinGHCi,版本2011.2.0.1
在Haskell的解释器GHCi中定义函数签名不起作用.从此页面复制示例:
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
Run Code Online (Sandbox Code Playgroud)
如何声明函数签名然后以交互方式在Haskell中给出函数定义?另外:为什么我不能简单地评估函数并Prelude> square在定义后查看其类型(例如)?
我正在阅读" 自然语言处理工作程序员 "一书.这本书使用了Haskell,我没有太多的经验.下面的代码在GHCI中引发错误
:{
do
l <- [0..9]
ps <- (\x -> [x-1, x+2]) l
return ps
:}
Run Code Online (Sandbox Code Playgroud)
这是返回的错误消息
The last statement in a 'do' construct must be an expression
我遇到的所有答案似乎都表明这是一个缩进错误,但据我所知,缩进似乎是正确的.任何想法可能是什么问题?
我想写一个函数,就像这样
double :: Int -> Int
double x = x + x
Run Code Online (Sandbox Code Playgroud)
问题是我写完第一行后:
Prelude> double :: Int -> Int
Run Code Online (Sandbox Code Playgroud)
我尝试按下回车键进入下一行,但是当我这样做时,我得到:
<interactive>:84:1: Not in scope: `double'
Prelude>
Run Code Online (Sandbox Code Playgroud)
似乎程序执行第一行,但我不想要那个,我希望程序让我写第二行然后才编译并执行
那么,我怎样才能进入Haskell的下一行(我在Mac OS上使用终端)?
我对Haskell很新,我必须说我很困惑
我正在使用GHCi前奏曲
首先尝试创建一个阶乘
Prelude> factorial 0 = 1
Prelude> factorial n = n*factorial(n-1)
Prelude> factorial 2
*** Exception: stack overflow
Run Code Online (Sandbox Code Playgroud)
最终堆栈溢出.显然递归并没有停止.
Prelude> :t factorial
factorial :: Num t => t -> t
Run Code Online (Sandbox Code Playgroud)
然后阅读这篇文章如何在多行中的ghci中定义一个函数?
我发现我必须使用多行版本或大括号(顺便说一句,这是一个运算符吗?)
Prelude> let { fact 0 = 1 ; fact n = n * fact (n-1) }
Prelude> fact 5
120
Prelude> ::t fact
fact :: (Eq p, Num p) => p -> p
Run Code Online (Sandbox Code Playgroud)
要么
Prelude> :{
Prelude| facto 0 = 1
Prelude| facto n = …Run Code Online (Sandbox Code Playgroud) 是否可以在GHCi中编写带有类型签名的多行函数定义(就像将其编写在源文件中一样)?
\n\n到目前为止我已经尝试过这样的事情:
\n\nPrelude> :{\nPrelude| let f :: Int -> Int;\nPrelude| f i = i + 1\nPrelude| :}\n\n<interactive>:9:1: parse error on input \xe2\x80\x98f\xe2\x80\x99\nRun Code Online (Sandbox Code Playgroud)\n\n但它不起作用...还有什么我可以尝试的吗?
\nfactorial :: Integer -> Integer
factorial n = product [1..n]
Run Code Online (Sandbox Code Playgroud)
以下是好的:
let factorial n = product [1..n]
Run Code Online (Sandbox Code Playgroud)
我没有看到如何在交互式shell中添加类型声明.
我尝试在GHCi中实现递归因子函数,但我收到以下错误:
Prelude> fact n = n * fact (n-1)
Prelude> fact 0 = 1
Prelude> fact 1
*** Exception: <interactive>:2:1-10: Non-exhaustive patterns in function fact
Run Code Online (Sandbox Code Playgroud)
这是从哪里来的,如何在将来避免这个错误?

我读了这篇文章.
这是您将在整个Haskell中看到的常见模式的一个非常简单的示例.制作明显正确的基本功能,然后将它们组合成更复杂的功能.这样你也可以避免重复.如果一些数学家发现2实际上是3并且你不得不改变你的程序怎么办?您可以重新定义
doubleMe为x + x + x自从doubleUs呼叫以来doubleMe,它将自动在这个奇怪的新世界中工作,其中2是3.
当我调用doubleUs 3 4它应该返回21因为我重新定义了doubleMe函数,但函数返回14.
我有这个功能inserts,其中
inserts 1 [2,3] = [[1,2,3],[2,1,3],[2,3,1]]
Run Code Online (Sandbox Code Playgroud)
这是定义(直接来自Bird和Gibbons的Haskell算法设计)
inserts :: a -> [a] -> [[a]]
inserts x [] = [[x]]
inserts x (y:ys) = (x:y:ys) : map (y:) (inserts x ys)
Run Code Online (Sandbox Code Playgroud)
我已经用上面的例子在 ghci 中尝试过,但我得到以下异常
[[1,2,3],[2,1,3]*** Exception: <interactive>:2:1-53: Non-exhaustive patterns in function inserts
Run Code Online (Sandbox Code Playgroud)
有谁知道缺少的模式是什么?
haskell ghci non-exhaustive-patterns multiline-repl-definition