我正在消化这个精彩的演示文稿为什么要学习Haskell?作者:Keegan McAllister.他在那里使用了片段
minimum = head . sort
Run Code Online (Sandbox Code Playgroud)
作为Haskell懒惰评估的一个例子,说明在Haskell中minimum有时间复杂度 O(n).但是,我认为这个例子具有学术性质.因此,我要求一个更实际的例子,即大多数中间计算都被抛弃,这并不是显而易见的.
我刚刚开始学习Haskell,我之前从未使用过函数式编程语言.我只是想知道合并排序的实现是好还是坏,究竟是好还是坏.也许它甚至是错的 - 它确实排序但是算法可能不是我想的合并排序.
告诉我在这里可以改进的一切.我自己认为它是一个非常清晰和简单的实现.谢谢你的建议,这里是代码:)
merge [] ys = ys
merge xs [] = xs
merge xs ys = sorted : merge left right
where
sorted = if head(xs) < head(ys) then head(xs) else head(ys)
left = if head(xs) <= head(ys) then tail(xs) else xs
right = if head(xs) > head(ys) then tail(ys) else ys
msort [] = []
msort [x] = [x]
msort xs = merge (msort left) (msort right)
where
left = take (div (length xs) 2) xs
right …Run Code Online (Sandbox Code Playgroud) 我有一个带有学生姓名和标记的字典
dict1 = {'name1': 34, 'name2':45, 'name3': 98, 'name4':34, 'name5': 66}
Run Code Online (Sandbox Code Playgroud)
我希望获得前10名学生的名字以及上述词汇中的分数.
结果:
name3 98
name5 66
name2 45
name1 34
name4 34
Run Code Online (Sandbox Code Playgroud)
如果多个键具有相同的值,则键必须按字母顺序排列(例如:name1和name4按字母顺序排列,相同值为34)
如何完成它?
我是Haskell的新手,我正在为我的Programming Languages课写一篇论文.我想用一些示例代码演示Haskell的懒惰,但我不确定我所看到的是否实际上是懒惰.
doubleMe xs = [x*2 | x <- xs]
Run Code Online (Sandbox Code Playgroud)
在ghci:
let xs = [1..10]
import Debug.Trace
trace (show lst) doubleMe (trace (show lst) doubleMe (trace (show lst) doubleMe(lst)))
Run Code Online (Sandbox Code Playgroud)
输出:
[1,2,3,4,5,6,7,8,9,10]
[1,2,3,4,5,6,7,8,9,10]
[1,2,3,4,5,6,7,8,9,10]
[8,16,24,32,40,48,56,64,72,80]
Run Code Online (Sandbox Code Playgroud)
感谢您的时间和帮助!