我刚刚开始学习Haskell的函数式编程,我需要你的帮助.
我们的想法是使用show函数以下列方式显示Matrix:
> Mat [[1,2,3],[4,5,6]]
1 2 3
4 5 6
Run Code Online (Sandbox Code Playgroud)
我已经有一个建议的解决方案可以实现上述结果,但我并不特别理解.
data Mat a = Mat {mrows :: [[a]]}
instance (Show a) => Show (Mat a) where
show = unlines . map (unwords . map show) . mrows
Run Code Online (Sandbox Code Playgroud)
我在互联网上搜索过这个部分,Mat {mrows :: [[a]]}但找不到任何有用的答案.为什么我们不能只宣称它Mat [[a]]?
此外,最后一行如何实现上述结果.如果答案太明显,我很抱歉,但我真的开始学习Haskell.
这实际上没问题 - 如果你愿意,你可以这样宣布它
data Mat a = Mat [[a]]
Run Code Online (Sandbox Code Playgroud)
那么你只需稍微改变show instance声明
instance (Show a) => Show (Mat a) where
show (Mat x) = unlines $ map (unwords . map show) x
Run Code Online (Sandbox Code Playgroud)
另一种方法有一些好处:
如果您想获得更高的性能,可以将data关键字更改为newtype.
此外,如果你想声明这个列表列表只包含相同大小的列表 - 你不能导出构造函数,Mat但提供一个'智能'构造函数,mat :: [[a]] -> Maybe (Mat a)如:
mat x = if (length $ nub $ map length x) <= 1) then Just x else Nothing
Run Code Online (Sandbox Code Playgroud)
但是使用后一种方法,[[a]]如果导出,您仍然可以提取零件mrows
module Mat (Mat, mrows, mat) where ...
Run Code Online (Sandbox Code Playgroud)
会隐藏Matconstrucor,但导出Matwhere 的类型
module Mat (Mat(..), mat) ...
Run Code Online (Sandbox Code Playgroud)
会出口一切
AAAA另一件事 - 如果你有一个有多个记录的类型说
data Pirate = Pirate { head :: HeadThing
, rightArm :: ArmThing
, leftArm :: ArmThing
, rightLeg :: LegThing
, leftLeg :: LegThing}
data ArmThing = ...
data HeadThing = ...
data LegThing = ...
Run Code Online (Sandbox Code Playgroud)
您可以使用记录语法更新一个(或多个"成员") - 即
redBeard :: Pirate
redBeard = blackbeard {head = RedBeard, rightArm = Hook}
Run Code Online (Sandbox Code Playgroud)