首先我在ubuntu 11.10下使用ghci来运行haskell代码。第二,这是我对哈斯克尔的第一次尝试。第三,我如何将文件加载到ghci中以及它需要在哪里定位以及它的扩展名应该是什么?我知道“:l”file.haskelxtnsn“”是如何加载文件的,但这是我迄今为止最好的猜测。
看到我可以做到以上所述,这段代码如何查找以升序合并两个可能无限大小的列表。 (由于缩进,我不能把它放在前奏>提示中???)鉴于[1,2,3]和[4,5,6],我应该得到[1,2,3,4,5,6] ],我认为用法是“拿10(merge listx listy)”
let merge x y = (min (head x) (head y)) :
case (min (head x) (head y)) of
head x -> merge (drop 1 x) y
head y -> merge x (drop 1 y)
伪:
答案 0 :(得分:1)
:cd
来更改目录,也可以提供:load
(简称:l
)命令的路径。你的逻辑是正确的,虽然我可能会用不同的方式编写它(希望你知道where和where子句并将函数定义为一系列方程式):
merge [] ys = ys
merge xs [] = xs
merge xs ys = min x y : if x < y then merge (tail xs) ys
else merge xs (tail ys)
where x = head xs
y = head ys
let
,这与let ... in ...
表达式不同。这是相当令人困惑的,所以我建议你把你的代码放在一个文件中并加载到ghci。:
运算符,因此不需要某些括号。我们通常会尽量减少括号的数量,以使代码更简洁,但不要过于热心。head x
,但你可以x:xs
(虽然我没有在这里)。多次致电head
和min
看起来多余,您也可以用drop 1
替换tail
。答案 1 :(得分:1)
如果要在GHCi提示符中输入此内容,可以这样做:
> let merge x y = (min (head x) (head y)) : case (min (head x) (head y)) of {
head x -> merge (drop 1 x) y ; head y -> merge x (drop 1 y) }
即。使用显式括号代替缩进(以上所有意味着在一条连续的行中输入)。将代码放入要加载的文件时,不应使用前导let
。
对于代码本身,它会导致错误“模式中的解析错误”。这是因为head x
不是有效模式。
您可以找到merge
代码,例如here:
merge (x:xs) (y:ys) | y < x = y : merge (x:xs) ys
| otherwise = x : merge xs (y:ys)
merge xs [] = xs
merge [] ys = ys
这可以保留重复数据。