要在 Lisp 中折叠平面列表,可以使用reduce:
* (reduce #'+ '(1 2 3 4 5))
15
Run Code Online (Sandbox Code Playgroud)
但是,如果我有一个任意复杂的树,并且我想对每个元素应用一个函数,该怎么办?那么折叠'(1 (2) (3 (4) 5))仍然会给出15?我尝试使用reduce,但我必须提供一个自定义函数,这有点违背了目的:
(defun tree+ (a b)
(cond ((null b) 0)
((atom b) (+ a b))
(t (+ (tree+ a (car b))
(tree+ 0 (cdr b))))))
(reduce #'tree+ '(1 (2) (3 (4) 5)) :initial-value 0) ; returns 15
Run Code Online (Sandbox Code Playgroud)
当然,我可以先展平列表,但这reduce是一个通用函数,有时您必须保留原始序列的结构和顺序。例如,map和filter可以用 来实现reduce。如果我想my-map基于编写 的实现reduce,那么:
(my-map '1+ '(1 (2 (3) …Run Code Online (Sandbox Code Playgroud) 如果X是一组数字,然后?X是一个多集的数字,表示每个2号之间的成对减法.例如,如果X一行中的一组点按递增顺序排列,那么?X这些点之间的成对距离是多重的.如何编写一个返回数字列表的成对距离的函数?以下工作,但我想要一个更优雅的解决方案.请包括理论或直觉,如果可能的话,可以提供有关如何解决类似问题的见解.
pairwise_distances :: [Int] -> [Int]
pairwise_distances [] = []
pairwise_distances [x] = []
pairwise_distances (x:xs) = sort $ map (abs . (x-)) xs ++ pairwise_distances xs
pairwise_distances [3,2,1] -- [1,1,2]
pairwise_distances [0,2,4,7,10] -- [2,2,3,3,4,5,6,7,8,10]
Run Code Online (Sandbox Code Playgroud) 我正在使用 Marp 生成 pdf 演示文稿(markdown 语法)。对于演示文稿,我必须从 pandas 数据框中插入表格。我现在使用的技巧是通过 pandas 打印“to_markdown”并将结果复制粘贴到我的 Markdown 代码中,但我无法更改字体大小并选择放置表格的位置。Marp文档对于此类问题没有太大帮助。如何修改 Markdown 中的字体大小和表格本地化?
我想定义一个元组(x, y)作为一个实例Enum类,知道这两个x和y的实例Enum.以下尝试:
instance (Enum x, Enum y) => Enum (x, y) where
toEnum = y
enumFrom x = (x, x)
Run Code Online (Sandbox Code Playgroud)
只导致错误(y不在范围内).我是Haskell的新手,有人可以解释如何声明这样的实例吗?
我正在自定义模式行,我想在其上放置一个字符串"未保存",如果文件被修改.如何直接从elisp中找出Emacs中的当前缓冲区是否被修改?
有时您需要一个方格的数据结构,例如,如果您为棋盘建模.表示方格数据的最简单方法是通过列表列表.
[[0,1,0],
[1,0,1],
[0,1,0]]
Run Code Online (Sandbox Code Playgroud)
以上是方格列表的示例.我的第一次尝试:
import Data.List
checker :: Integral i => i -> a -> a -> [[a]]
checker n a b = genericTake n $ intersperse (genericTake n xs2) $ repeat (genericTake n xs1)
where xs1 = checker' a b
xs2 = drop 1 xs1
checker' :: a -> a -> [a]
checker' a b = intersperse b $ repeat a
Run Code Online (Sandbox Code Playgroud)
代码很冗长,但结果是正确的:
*Main> checker 5 0 1
[[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]]
Run Code Online (Sandbox Code Playgroud)
如何在Haskell中编写一个函数来创建任意大小的列表?
我有一个基本的 MARP 演示文稿,https://github.com/marp-team/marp。我想添加链接来模拟脚注或参考文献。可以吗,导出PDF怎么样?
Some text with source. [1]
Run Code Online (Sandbox Code Playgroud)
“1”应该链接到另一张幻灯片:
1. some description
Run Code Online (Sandbox Code Playgroud)
PS 我没有足够的声誉来marp为这个问题创建标签,如 MARP 自述文件所述。
最近我试图使用Foldr解决问题.任务如下:
In:[5,1,3,8,2,4,7,1]
Out:[16,8]
Run Code Online (Sandbox Code Playgroud)
这意味着,我将输入列表中的那些元素加倍,这些元素位于奇数索引位置和偶数位.我编写的程序没有使用以下的foldr :(它显示模式匹配失败:head [])
findPos list elt =
map fst $ filter ((elt==).snd) $ zip [0..] list
doublePos [] = []
doublePos (x:xs)
| ((head(findPos xs x)`mod` 2) /= 0) && (x `mod` 2 == 0) =
[2*x] ++ doublePos xs
| otherwise = doublePos xs
Run Code Online (Sandbox Code Playgroud)
如何使用foldr编写此程序?
我正在尝试编写一个Haskell代码,它接受一个列表并返回一个列表列表.当我这样做,如下面的代码,我得到"函数reGroup中的非穷举模式"
reGroup :: [[Int]] -> [Int] -> [[Int]]
reGroup [[]] [] = [[]]
reGroup [[]] xs = reGroup [(take 3 xs)] (drop 3 xs)
reGroup [[a]] [] = [[a]]
reGroup [[a]] xs = reGroup [[a], (take 3 xs)] (drop 3 xs)
-- calling the reGroup function from another function as follow
reGroup [[]] [1,2,3,4,5,6,7,8,9]
Run Code Online (Sandbox Code Playgroud)
我想要的是[1,2,3,4,5,6,7,8,9]- > [[1,2,3], [4,5,6], [7,8,9]].我做错了什么或有人能告诉我一个简单的方法吗?
向大家学习Haskell("高阶函数"一节,"有些高阶有序"这一小节)描述了一个函数applyTwice,它在一个参数上调用两次函数:
applyTwice :: (a -> a) -> a -> a
applyTwice f x = f (f x)
Run Code Online (Sandbox Code Playgroud)
但是我需要一个函数,它可以在某个参数上应用某些函数任意次数.例如applyN 3 f x,相当于f $ f $ f x.我如何在Haskell中编写重复应用程序的功能?请发布任何可能的解决方案,使用递归,高阶函数或其他任何东西.
我有一份清单清单:(setq xs (list (list 1 2 3) (list 4 5 6) (list 7 8 9))).我想删除每个列表中的第一个元素((2 3) (5 6) (8 9)).非破坏性的做法很容易:(mapcar 'cdr xs).但我想改变原始列表.我试过了:
(mapcar (lambda (x) (setf x (cdr x))) xs)
(mapcar (lambda (x) (pop x)) xs)
Run Code Online (Sandbox Code Playgroud)
但它不起作用.如何xs在不创建任何临时列表的情况下尽可能有效地更改每个变量列表?