1

首先,我在 ubuntu 11.10 下使用 ghci 来运行 haskell 代码。第二这是我第一次尝试haskell。第三,我如何将文件加载到 ghci 中,它需要放在哪里,它的扩展名应该是什么?我知道 ":l "file.haskelxtnsn"" 是如何加载文件的,但这是我迄今为止最好的猜测。

看到我可以执行上述操作,此代码如何查找以升序合并两个可能无限大小的列表。(由于缩进,我不能把它放在前奏>提示符中???)给定 [1, 2, 3] 和 [4, 5, 6] 我应该得到 [1, 2, 3, 4, 5, 6 ],我认为用法是“take 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)

伪:

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

2 回答 2

1
  • 通常使用的扩展名是“.hs”。
  • 您可以:cd在 ghci 中使用来更改目录,也可以提供:load:l简称)命令的路径。
  • 你的逻辑是正确的,虽然也许我会写得有点不同(希望你知道 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在定义前面加上 a,这与let ... in ...表达式不同。这相当令人困惑,所以我建议您将代码放在一个文件中并在 ghci 中加载它。
  • 函数应用程序的优先级高于:运算符,因此不需要括号。我们通常会尽量减少括号的数量以使代码更简洁,但不要过分热衷于它。
  • 我真的不明白在这里使用 case 表达式的意义(除了导致错误)。尝试阅读模式匹配以获取更多详细信息,数据构造函数与函数应用程序,为什么你不能head x在模式中使用但你可以这样做x:xs(虽然我没有在这里)。调用headandmin多次看起来是多余的,你也可以drop 1tail.
于 2012-07-27T18:20:30.403 回答
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不应使用前导。

至于代码本身,它会导致错误“Parse error in pattern”。这是因为head x不是有效的模式。

您可以在此处找到merge代码,例如:

merge (x:xs) (y:ys) | y < x     = y : merge (x:xs) ys
                    | otherwise = x : merge  xs (y:ys)
merge  xs     []                = xs
merge  []     ys                = ys

这会保留重复项。

于 2012-07-27T18:21:37.220 回答