我正在学习《Real World Haskell》,目前在做第三章末尾的练习。
我采取了一种不同寻常的方法:即使我知道他们尚未涵盖的某些语言特性可以帮助我,我仍然尝试使用只有他们明确介绍过的东西来完成这些练习。为什么?只是为了好玩。感觉这迫使我多练习递归。
所以我刚刚完成了以下练习:“创建一个函数,根据每个子列表的长度对列表的列表进行排序。(您可能需要查看Data.List模块中的sortBy函数。)” 现在,他们提供了关于Data.List模块的提示。但他们没有提及参考文档在哪里,如何导入内容等。因此,我决定自己编写排序,只是为了看看自己能否做到。我使用了冒泡排序算法,因为它是最简单的算法。
结果如下。我希望你们擅长Haskell的人能够批评一下...但是请记住以下警告:如果您建议改进,请基于《Real World Haskell》第3章涵盖的语言特性(或者您猜测这些特性而不必费心去查找)。我知道有很多很棒的语言特性等着我,可以让我使代码更好,但现在具体的挑战是使用到目前为止“原始”的特性来完成它。 我相信有些情况下我可能在做无用功,使用显式控制流时递归和模式匹配可能对我更有利等等。我相信代码可以变得更短更易读。我敢打赌我不知道可以与我限制自己使用的原始语言特性一起使用的好习惯。这些是我想收到的提示。
这可能是我以任何语言为荣的最丑陋的代码(至少我能记得的)。我在函数式语言中的第一次尝试,超越了“Hello, world”类型的东西。现在你要把它搞砸 :) 。请温柔点,但我期待一些有见地的洞察力。谢谢。
我采取了一种不同寻常的方法:即使我知道他们尚未涵盖的某些语言特性可以帮助我,我仍然尝试使用只有他们明确介绍过的东西来完成这些练习。为什么?只是为了好玩。感觉这迫使我多练习递归。
所以我刚刚完成了以下练习:“创建一个函数,根据每个子列表的长度对列表的列表进行排序。(您可能需要查看Data.List模块中的sortBy函数。)” 现在,他们提供了关于Data.List模块的提示。但他们没有提及参考文档在哪里,如何导入内容等。因此,我决定自己编写排序,只是为了看看自己能否做到。我使用了冒泡排序算法,因为它是最简单的算法。
结果如下。我希望你们擅长Haskell的人能够批评一下...但是请记住以下警告:如果您建议改进,请基于《Real World Haskell》第3章涵盖的语言特性(或者您猜测这些特性而不必费心去查找)。我知道有很多很棒的语言特性等着我,可以让我使代码更好,但现在具体的挑战是使用到目前为止“原始”的特性来完成它。 我相信有些情况下我可能在做无用功,使用显式控制流时递归和模式匹配可能对我更有利等等。我相信代码可以变得更短更易读。我敢打赌我不知道可以与我限制自己使用的原始语言特性一起使用的好习惯。这些是我想收到的提示。
这可能是我以任何语言为荣的最丑陋的代码(至少我能记得的)。我在函数式语言中的第一次尝试,超越了“Hello, world”类型的东西。现在你要把它搞砸 :) 。请温柔点,但我期待一些有见地的洞察力。谢谢。
areListsEqual :: (Eq a) => [a] -> [a] -> Bool
areListsEqual [] [] = True
areListsEqual [] _ = False
areListsEqual _ [] = False
areListsEqual xs ys = (head xs == head ys) && (areListsEqual (tail xs) (tail ys))
charlieSort :: (Eq a) => [[a]] -> [[a]]
charlieSort [] = []
charlieSort (x:xs) | null xs = [x]
charlieSort xs | (length xs) >= 2 = if(not (areListsEqual xs wip))
then charlieSort wip
else wip
where
first = head xs
second = head (tail xs)
theRest = drop 2 xs
swapPairIfNeeded a b = if(length a >= length b)
then [second, first]
else [first, second]
modifiedPair = swapPairIfNeeded first second
wip = (take 1 modifiedPair) ++ charlieSort ( (drop 1 modifiedPair) ++ theRest)