小编Fer*_*yll的帖子

Haskell 中的笛卡尔列表乘积(内存和速度)

我正在尝试cart :: [[a]] -> [[a]]为笛卡尔积编写一个通用函数,以便生成从 0 到 7 的 9 元组数字集(9 个元素的列表,而不是实际的 9 元组)。我已经编写了几个语法相似的函数,但它们的性能却大不相同。

cart :: [[a]] -> [[a]]
cart [] = [[]]
cart (xs:xss) = [x:ys | x <- xs, ys <- cart xss]

cart' :: [[a]] -> [[a]]    -- Reverse binding
cart' [] = [[]]
cart' (xs:xss) = [x:ys | ys <- cart' xss, x <- xs]

xs = [0..7]

length $ cart $ replicate 9 xs    -- This is slow (4.1s) and memory hungry (1916MB …
Run Code Online (Sandbox Code Playgroud)

haskell cartesian-product

5
推荐指数
0
解决办法
132
查看次数

嵌套列表附加在Haskell中

我正在尝试编写一个将给定值附加到嵌套列表结构的最内层列表的函数,但是当我甚至不确定这样一个函数的类型签名是什么时,我会遇到类型错误.

digpend a xs = case xs of [_:_] -> map (digpend a) xs
                          [[]]  -> [[a]]
                          xs    -> a:xs
Run Code Online (Sandbox Code Playgroud)

例如,

digpend 555 [ [ [ 5,1,-12,33 ] , [ 6,22 ] ] , [ [ -9,0,9,12,83 ] ] ]
Run Code Online (Sandbox Code Playgroud)

应该回来

[ [ [ 555,5,1,-12,33 ] , [ 555,6,22 ] ] , [ [ 555,-9,0,9,12,83 ] ] ]
Run Code Online (Sandbox Code Playgroud)

理想情况下,它可以通过递归在任何级别的嵌套上工作.这是允许的吗?

haskell nested

3
推荐指数
1
解决办法
505
查看次数

Haskell推断/显式绑定的类型

我正在尝试编写一个函数来比较两个给定图中节点的度数列表,以进行同构的充分性测试,但我注意到以下代码抛出了与以下类型相关的错误degs:

import Data.List

degreeNumbers :: (Eq a) => Graph a -> [Int]
degreeNumbers g = ...

isoByDegree :: (Eq a, Eq b) => Graph a -> Graph b -> Bool
isoByDegree g1 g2 = degs g1 == degs g2
        where degs = sort . degreeNumbers
Run Code Online (Sandbox Code Playgroud)

即使我尝试degs使用类似的显式声明进行绑定

where degs = (sort . degreeNumbers) :: (Eq c) => Graph c -> [Int]
Run Code Online (Sandbox Code Playgroud)

它仍然表示它期待一种Graph a而不是Graph b应用于它g2.当然,有一个简单的解决方案

isoByDegree g1 g2 = (sort . degreeNumbers) …
Run Code Online (Sandbox Code Playgroud)

haskell types

2
推荐指数
1
解决办法
63
查看次数

C语言中迷宫生成算法的细微缺乏随机性

这涉及我只能猜测的是用于生成随机迷宫的某人代码中的缺陷.代码有点长,但大部分都是注释掉的选项和/或没有特别关注随机化.

我得到了2001x2001迷宫从链接dllu竖起并保存为PNG 这里.从那以后,我创造了这个.为了获得蓝色图案,我开始从迷宫的左下角开始填充死角.根据他使用的回溯算法,这就是迷宫开始产生的点:所以如果你跟踪由此产生的死角的踪迹,你可以系统地填充迷宫那一侧的所有死角.换句话说,中心蓝色质量表示从左下角开始直到2678 x 1086处的唯一前沿像素的总可访问区域.

但是有一些东西立即异常,因为蓝色的"分形"似乎重演了.实际上,通过覆盖分形的一部分,旋转和镜像,您可以看到形状的确切对应.这个叠加层的另一个异常将一个大陆的一部分映射到另一个大陆,但奇怪的是这次只有一块大陆.显然这些不是唯一的自动对应.

但是除了死端组件的形状之外,当你放大时,墙壁的实际图案会重复出来.最奇怪的是,重复并不精确,但只有50-60%的墙壁对应.放大和区域的样本:

明亮区域表示同构,黑暗区域表示缺乏同构

问题很简单,代码中是什么造成了这种模糊的随机性缺失?

c random algorithm debugging maze

1
推荐指数
1
解决办法
78
查看次数

标签 统计

haskell ×3

algorithm ×1

c ×1

cartesian-product ×1

debugging ×1

maze ×1

nested ×1

random ×1

types ×1