Haskell,正在加载,这个合并函数正确吗?

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

首先,我使用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)”

普苏埃多:

  • 输出列表标题的最小值
  • 如果第一个列表头是输出,则调用与第一个列表和第二个列表的其余部分合并
  • else调用与第一个列表和第二个列表的其余部分合并
      • 通常使用的扩展名是“.hs”
      • 您可以在ghci中使用
        :cd
        来更改目录,还可以提供
        :load
        :l
        )命令的路径
      • 您的逻辑是正确的,尽管我可能会写得有点不同(希望您知道and where子句并将函数定义为一系列方程):

        merge[]ys=ys
        合并xs[]=xs
        合并xs ys=最小x y:如果x
      • 在ghci中,定义前面需要一个
        let
        ,这不同于
        let。。。在…
        表达式中。这相当令人困惑,所以我建议您将代码放在一个文件中,然后加载到ghci中
      • 函数应用程序的优先级高于
        运算符,所以有些人不需要括号。我们通常会尽量减少括号的数量,以使代码更简洁,但不要过于热心
      • 我真的不明白在这里使用case表达式的意义(除了导致错误)。尝试阅读模式匹配,了解更多详细信息,数据构造函数与函数应用程序,为什么不能在模式中使用
        head x
        ,但可以使用
        x:xs
        (尽管我没有在这里)。多次调用
        head
        min
        看起来是多余的,andy ou也可以用
        tail
        替换
        drop 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) }
      
      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