Haskell - 如何创建矩阵

177*_*775 4 haskell list matrix

给定矩阵的大小和位置p.如何用p中的1和其他位置的0填充矩阵?

Ex.: size=(3,3) p=(3,1)

[0 0 0]
[0 0 0]
[1 0 0]
Run Code Online (Sandbox Code Playgroud)

我定义了:

type Matrix= [[Int]]
type Pos = (Int,Int)

f:: Pos->Pos->Matrix
Run Code Online (Sandbox Code Playgroud)

f例如,回报将是:

 [[0,0,0],[0,0,0],[1,0,0]]
Run Code Online (Sandbox Code Playgroud)

我很难开始,即在想法如何实现该功能f.谁能帮我?

pig*_*ker 9

我喜欢AndrewC的答案,但我会一次性完成它,嵌套列表推导并只测试位置的相等性,而不是单独的行和列.

f :: Pos -> Pos -> Matrix
f (h, w) p =  [ [if (y, x) == p then 1 else 0 | x <- [1..w]]
              | y <- [1..h]]
Run Code Online (Sandbox Code Playgroud)

我已经选择了我的对齐方式,以便x水平拉伸并y垂直拉伸,事物的核心是根据坐标定义典型元素的表达式.如果行不同,则不会对列进行比较.我想人们可以用来replicate w 0更有效地计算全零行,但代价是清晰.

我也考虑写作

g :: Pos -> Pos -> Matrix
g (h, w) (y, x)  =   replicate (y-1) wzeros
                 ++  (replicate (x-1) 0 ++ 1 : replicate (w-x) 0)
                 :   replicate (h-y) wzeros
  where wzeros = replicate w 0
Run Code Online (Sandbox Code Playgroud)

这更长,但在空间上更直接.它保留了更多的共享,也许减少了一些.但如果位置超出相关范围,其行为有点怪异.


And*_*ewC 6

你可以通过两个列表推导来实现,一个在彼此内部使用:

将问题分解为两个较小但相似的问题:

row b lengthacross = 
   [ --some expression that's 1 if x == b and zero otherwise
         | x <- [1..lengthacross]]
Run Code Online (Sandbox Code Playgroud)

row会有什么类型的?

matrix (a,b) (lendown,lenacross) = 
   [ --a row with a 1 in it or just zeros as appropriate 
        | y <- --an appropriate list
          ]
Run Code Online (Sandbox Code Playgroud)

matrix会有什么类型的?