Haskell,正在加载,这个合并函数正确吗?
首先,我使用Ubuntu11.10下的ghci来运行haskell代码。这是我第一次尝试haskell。第三,如何将文件加载到ghci中,它需要位于何处,扩展名应该是什么?我知道“:l”file.haskelxtnsn”是如何加载文件的,但这是我目前为止最好的猜测 正如我所能做的那样,这段代码是如何以升序合并两个可能无限大的列表的。(由于缩进的原因,我不能将其放在prelude>提示符中。)给定[1,2,3]和[4,5,6],我应该得到[1,2,3,4,5,6],我认为用法应该是“take 10(merge listx listy)” 普苏埃多:Haskell,正在加载,这个合并函数正确吗?,haskell,Haskell,首先,我使用Ubuntu11.10下的ghci来运行haskell代码。这是我第一次尝试haskell。第三,如何将文件加载到ghci中,它需要位于何处,扩展名应该是什么?我知道“:l”file.haskelxtnsn”是如何加载文件的,但这是我目前为止最好的猜测 正如我所能做的那样,这段代码是如何以升序合并两个可能无限大的列表的。(由于缩进的原因,我不能将其放在prelude>提示符中。)给定[1,2,3]和[4,5,6],我应该得到[1,2,3,4,5,6],我认为用法应该是“take 10
- 输出列表标题的最小值
- 如果第一个列表头是输出,则调用与第一个列表和第二个列表的其余部分合并
- else调用与第一个列表和第二个列表的其余部分合并
- 通常使用的扩展名是“.hs”
- 您可以在ghci中使用
来更改目录,还可以提供:cd
(:load
)命令的路径:l
- 您的逻辑是正确的,尽管我可能会写得有点不同(希望您知道and where子句并将函数定义为一系列方程):
merge[]ys=ys 合并xs[]=xs 合并xs ys=最小x y:如果x
- 在ghci中,定义前面需要一个
,这不同于let
表达式中。这相当令人困惑,所以我建议您将代码放在一个文件中,然后加载到ghci中let。。。在…
- 函数应用程序的优先级高于
运算符,所以有些人不需要括号。我们通常会尽量减少括号的数量,以使代码更简洁,但不要过于热心:
- 我真的不明白在这里使用case表达式的意义(除了导致错误)。尝试阅读模式匹配,了解更多详细信息,数据构造函数与函数应用程序,为什么不能在模式中使用
,但可以使用head x
(尽管我没有在这里)。多次调用x:xs
和head
看起来是多余的,andy ou也可以用min
替换tail
drop 1
> 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) }
i、 e.使用显式大括号代替缩进(所有上述内容均应在一条完整的行中输入)。将代码放入要加载的文件时,不应使用前导的let
至于代码本身,它会导致一个错误“模式中的解析错误”。这是因为头x
不是有效的模式
您可以找到一个合并
代码,例如:
merge(x:xs)(y:ys)| y
这将保留重复项。我们目前正在查看模式匹配。这就像是试图听来自3000年的13岁女孩谈论她们的塔玛加奇,令人恼火,但却有点有趣。。。。但是谢谢你!我怎样才能找出我当前的目录在ghci中是什么?sxu,这段代码不会加载,我会不断出错,例如“发生检查:无法在
head'的第一个参数中构造无限类型:a0=[a0],即表达式中的
y':y=head y“@BumSkeeter抱歉,我应该先自己试试,更新一下。同样在处理列表的函数编程中,我们通常使用x
表示元素,xs
(复数)表示列表。我相信你会在这一过程中发现更多…@BumSkeeter Just:reload或:l。
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 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) }
merge (x:xs) (y:ys) | y < x = y : merge (x:xs) ys
| otherwise = x : merge xs (y:ys)
merge xs [] = xs
merge [] ys = ys