繁体   English   中英

在haskell中显示矩阵函数

[英]Show matrix function in haskell

我刚刚开始学习Haskell的函数式编程,在下面的例子中我需要你的帮助。

我们的想法是使用show函数以下列方式显示Matrix:

> Mat [[1,2,3],[4,5,6]]
  1 2 3
  4 5 6

我已经有一个建议的解决方案可以实现上述结果,但我并不特别理解。

data Mat a = Mat {mrows :: [[a]]}
instance (Show a) => Show (Mat a) where
     show  =  unlines . map (unwords . map show) . mrows

我在互联网上搜索了这部分Mat {mrows :: [[a]]}但找不到任何有用的答案。 为什么我们不能只将它声明为Mat [[a]]

此外,最后一行如何实现上述结果。 如果答案太明显,我很抱歉,但我真的开始学习Haskell。

这实际上没问题 - 如果你愿意,你可以这样宣布它

data Mat a = Mat [[a]]

那么你只需稍微改变show instance声明

instance (Show a) => Show (Mat a) where
     show (Mat x) = unlines $ map (unwords . map show) x

编辑

另一种方法有一些好处:

如果您想获得更高的性能,可以将data关键字更改为newtype

此外,如果你想断言这个列表列表只包含相同大小的列表 - 你不能导出构造函数Mat但提供'智能'构造函数mat :: [[a]] -> Maybe (Mat a) like:

mat x = if  (length $ nub $ map length x) <= 1) then Just x else Nothing

但是使用后一种方法,如果导出mrows你仍然可以提取[[a]]部分

module Mat (Mat, mrows, mat) where ...

会隐藏Mat construcor,但是将Mat的类型导出到哪里

module Mat (Mat(..), mat) ...

会出口一切

EDIT2

AAAA另一件事 - 如果你有一个有多个记录的类型说

data Pirate = Pirate { head :: HeadThing
                     , rightArm :: ArmThing
                     , leftArm :: ArmThing
                     , rightLeg :: LegThing
                     , leftLeg :: LegThing}

data ArmThing = ...
data HeadThing = ...
data LegThing = ...

您可以使用记录语法更新一个(或多个“成员”) - 即

redBeard :: Pirate
redBeard = blackbeard {head = RedBeard, rightArm = Hook}
data Mat a = Mat {mrows :: [[a]]}

这是Haskell的“记录语法”。 (这是您要搜索的术语。)上述声明与之相同

data Mat a = Mat [[a]]

区别在于第二个声明了一个Mat构造函数,其中包含[[a]]类型的“未命名”字段,第一个字段命名字段mrows 特别是,这自动定义了一个功能

mrows :: Mat a -> [[a]]

“解开” Mat构造函数。 您还可以在模式中使用名称mrows ,但这对于具有许多字段的构造函数通常更有用,而不仅仅是一个。

命名字段也可以使用未命名的语法引用,因此命名版本可以执行未命名版本所做的所有操作以及更多内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM