gpt4 book ai didi

haskell - 在haskell中显示矩阵函数

转载 作者:行者123 更新时间:2023-12-02 21:32:44 25 4
gpt4 key购买 nike

我刚刚开始使用 Haskell 学习函数式编程,在下面的情况下我需要你的帮助。

这个想法是通过以下方式使用 show 函数显示矩阵:

> 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]]

那么你只需稍微改变一下显示实例声明

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

编辑

另一种方法有一些优点:

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

此外,如果您想断言此列表列表仅包含相同大小的列表 - 您可以导出构造函数Mat,但提供一个“智能”构造函数mat::[[a]] -> Maybe (Mat a) 就像:

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

但使用后一种方法,如果导出 mrows

,您仍然可以提取 [[a]] 部分
module Mat (Mat, mrows, mat) where ...

将隐藏Mat构造函数,但导出Mat的类型,其中

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

将导出所有内容

编辑2

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}

关于haskell - 在haskell中显示矩阵函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42544101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com