【发布时间】:2021-04-19 02:27:50
【问题描述】:
我是 Haskell 的初学者,具有命令式语言的背景,我想知道是否可以在 Haskell 函数中打印而不是在 main 中打印。
merge :: Ord a => [a] -> [a] -> [a]
merge [] ys = ys
merge xs [] = xs
merge (x:xs) (y:ys)
| x < y = x:(merge xs (y:ys))
| otherwise = y:(merge (x:xs) ys)
我想在每次合并操作后查看列表的内容,但是当我尝试在此函数中插入 print 语句时出现错误。此代码是执行合并排序操作的程序的一部分,因此我无法在主函数中放置打印语句。我会使用 ghci,并从单独的文件中编译合并函数以手动查看合并函数的工作原理,但我很好奇是否可以在合并函数本身中查看列表的内容。
给定此合并功能,我将如何显示列表的内容?我是否需要以另一种方式重新编码整个合并函数才能查看列表的内容?如果有,会是什么样子?
【问题讨论】:
-
你可能想使用
traceShow函数 -
一个可能的技巧,在需要时打印两个中间值,而当你不需要时不会强迫你进入
IO:stackoverflow.com/a/41791334/1364288 缺点是它迫使你在一个单子上多态地工作,并且您必须以“打开”的方式编写递归——只有在插入“仪器”后,才能在稍后使用fix关闭它。
标签: haskell functional-programming mergesort