Haskell,加载并且这个合并函数是否正确?

时间:2012-07-27 18:01:58

标签: haskell

首先我在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)

伪:

  • 输出列表头部的最小值
  • 如果第一个列表头是输出调用与第一个列表的其余部分和第二个
  • 的合并
  • else调用第一个列表和第二个列表的其余部分的合并

2 个答案:

答案 0 :(得分:1)

  • 通常使用的扩展名是“.hs”。
  • 您可以在ghci中使用: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
    
  • 在ghci中,您需要在定义前面加let,这与let ... in ...表达式不同。这是相当令人困惑的,所以我建议你把你的代码放在一个文件中并加载到ghci。
  • 函数应用程序的优先级高于:运算符,因此不需要某些括号。我们通常会尽量减少括号的数量,以使代码更简洁,但不要过于热心。
  • 我真的没有看到在这里使用case表达式的意义(除了导致错误)。尝试阅读模式匹配以获取更多细节,数据构造函数与函数应用程序,为什么你不能在模式中使用head x,但你可以x:xs(虽然我没有在这里)。多次致电headmin看起来多余,您也可以用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

这可以保留重复数据。