Haskell 哈斯克尔';函数'中的s代码缩进问题;s定义
我试图在Haskell中编写mergesort,但出现了一些问题。 我认为下面的代码应该是正确的 所以函数的定义有问题。 例如,我尝试用许多不同的方法来修复布局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
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