【发布时间】:2020-12-20 21:08:02
【问题描述】:
在进行用户界面编程时,我经常遇到需要渲染一个值列表并在渲染的值之间添加一些相关信息。在下面的代码示例中,我将数值呈现为出现在括号中的字符串,并将两个值的距离呈现为放置在值呈现之间的字符串。该代码有效,但我想知道 mystery 函数的实现是否可作为 Haskell 标准库的一部分。我也对其他库中用于此函数的名称感兴趣,因为使用人类可读的单词可以更轻松地进行谷歌搜索。
mystery :: (a -> b) -> (a -> a -> b) -> [a] -> [b]
mystery n d [] = []
mystery n d [x] = [n x]
mystery n d (x:xs) = (n x) : (d x (head xs)) : mystery n d xs
node x = "(" ++ show x ++ ")"
distance x y = "-" ++ (show $ abs $ x - y) ++ "-"
render xs = concat $ mystery node distance xs
-- render [25, 68, 54, 15] == "(25)-43-(68)-14-(54)-39-(15)"
【问题讨论】:
-
我找不到比您的方法更简单的方法了。原则上我们可以使用
concat $ zipWith next ys (tail ys) where next x y = [n x, d x y],但这会错过最后一个数字。我们需要一个更通用的zipWith,它允许处理第一个列表非空但第二个列表非空的情况。我在图书馆找不到那个。我们可以使用++ [n $ last ys],但这在我看来很难看。
标签: haskell