Haskell 哈斯克尔';函数'中的s代码缩进问题;s定义

Haskell 哈斯克尔';函数'中的s代码缩进问题;s定义,haskell,layout,syntax-error,mergesort,Haskell,Layout,Syntax Error,Mergesort,我试图在Haskell中编写mergesort,但出现了一些问题。 我认为下面的代码应该是正确的 所以函数的定义有问题。 例如,我尝试用许多不同的方法来修复布局 mergeSort xs | length xs < 2 = xs | otherwise = merge (mergeSort (myleft xs)) (mergeSort (myright xs)) where myleft xs = take (half xs) xs myr

我试图在Haskell中编写mergesort,但出现了一些问题。 我认为下面的代码应该是正确的

所以函数的定义有问题。 例如,我尝试用许多不同的方法来修复布局

 mergeSort xs
    | length xs < 2 = xs
    | otherwise  = merge (mergeSort (myleft xs)) (mergeSort (myright xs))
    where myleft xs = take (half xs) xs
          myright xs = drop (half xs) xs
          where half = \xs -> div (length xs) 2 
mergeSort-xs
|长度xs<2=xs
|否则=合并(mergeSort(myleft-xs))(mergeSort(myright-xs))
其中myleft xs=take(half-xs)xs
myright xs=下降(一半xs)xs
其中half=\xs->div(长度xs)2
但它们都不起作用

我也在这里寻找解决方案,我发现了一些非常接近我所做的--> 它还提供了正确的代码

mergeSort merge xs
        | length xs < 2 = xs
        | otherwise = merge (mergeSort merge first) (mergeSort merge second)
        where first = take half xs 
              second = drop half xs 
              half = length xs `div` 2
mergeSort合并xs
|长度xs<2=xs
|否则=合并(合并排序合并第一次)(合并排序合并第二次)
其中first=取半个xs
第二个=下降一半X
一半=长度xs`div`2
但这为什么有效呢?在哪里指定“一半”不需要一秒钟吗?为什么没有呢? 我不明白为什么我的代码不起作用。

在你的代码中,一半在myright定义中只是“可见的”

在起作用的地方移除第二个

merge :: [a] -> [a] -> [a]
merge = undefined

mergeSort :: [a] -> [a]
mergeSort xs
  | length xs < 2 = xs
  | otherwise  = merge (mergeSort (myleft xs)) (mergeSort (myright xs))
     where myleft xs = take (half xs) xs
           myright xs = drop (half xs) xs
           half = \xs -> div (length xs) 2 
merge::[a]->[a]->[a]
合并=未定义
合并排序::[a]->[a]
合并排序xs
|长度xs<2=xs
|否则=合并(mergeSort(myleft-xs))(mergeSort(myright-xs))
其中myleft xs=take(half-xs)xs
myright xs=下降(一半xs)xs
half=\xs->div(长度xs)2

看起来您正在使用
mergesort xs调用mergesort
您可以共享完整文件吗。在此之前可能有语法错误。当然,我会立即更新问题。在第一个代码片段中,
myright
中提供了您的
half
,但没有
myleft
,因为第二个
where
附加到
myright
的定义。另外,请不要在评论中张贴代码:而是编辑您的问题,以便其格式正确/缩进。我无法将“一半”的定义附加到这两行?我必须写两遍“where half(…)”吗?非常感谢!!现在我明白了“何处”是如何正常工作的
mergeSort merge xs
        | length xs < 2 = xs
        | otherwise = merge (mergeSort merge first) (mergeSort merge second)
        where first = take half xs 
              second = drop half xs 
              half = length xs `div` 2
merge :: [a] -> [a] -> [a]
merge = undefined

mergeSort :: [a] -> [a]
mergeSort xs
  | length xs < 2 = xs
  | otherwise  = merge (mergeSort (myleft xs)) (mergeSort (myright xs))
     where myleft xs = take (half xs) xs
           myright xs = drop (half xs) xs
           half = \xs -> div (length xs) 2