Haskell从newtype数据创建列表

时间:2015-10-08 22:17:40

标签: haskell matrix newtype

这是首先完成的家庭作业。我们给出了一个新类型Matrix,它是教授对抽象矩阵的实现。我的主要问题是如何创建Matrix类型列表。我需要实现的第一个函数fillWith采用一个元组,即要创建的矩阵的行数(行数,列数)以及放置在每个索引处的数据。

module Matrix (Matrix, fillWith, fromRule, numRows, numColumns, 
           at, mtranspose, mmap, add, mult) 
where

-- newtype is like "data", but has some efficiency advantages
newtype Matrix a = Mat ((Int,Int),(Int,Int) -> a)

--fillWith   :: (Int,Int) -> a -> (Matrix a)
--fillWith ix val = Mat ((, 


--trying to create a row of type Matrix
row_matrix :: [a] -> Matrix a
row_matrix ls = Mat ((1, length ls), (\x y -> if x > 1 then undefined else ls !! (y-1)))

1 个答案:

答案 0 :(得分:5)

你只是错过了一些parens和逗号:

row_matrix ls = Mat ((1, length ls), (\(x,y) -> if x > 1 then undefined else ls !! (y-1)))
                                       ^-^-^--- add these

Mat是一个元组,其中:

  • 第一个元素本身就是一个元组,
  • 第二个元素是一个将元组带入类型a的值的函数

您可以始终使用wherelet子句来简化值的构造,例如:

row_matrix as = Mat (bounds, accessor)
  where bounds = (1, length as)
        accessor (i,j) = if i > 1 then undefined else as !! (j-1)

使用where子句使代码更具可读性。

要实施fillWith,我会遵循相同的方法:

fillWith bounds val = Mat (bounds, accessor)
  where accessor (i,j) = ???

我认为现在显而易见的是???应该是。