Haskell双数组模式匹配

Haskell双数组模式匹配,haskell,Haskell,我对这些数据类型有一个定义 data RGB = RGB Int Int Int data Grid a = G [[a]] 和一个函数 returnFirstRed :: Grid RGB -> Int 因此,基本上,函数从RGB值的双数组返回第一个颜色值 网格RGB看起来像 G[[RGB 50, 50, 50, RGB 100,200, 200], [RGB, 75,75,75, RGB 80,80,80]] 所以对于这个网格,我想返回50 我的问题是模式匹配和从网

我对这些数据类型有一个定义

data RGB = RGB Int Int Int 

data Grid a = G [[a]] 
和一个函数

returnFirstRed :: Grid RGB -> Int
因此,基本上,函数从RGB值的双数组返回第一个颜色值

网格RGB看起来像

 G[[RGB 50, 50, 50, RGB 100,200, 200],
   [RGB, 75,75,75, RGB 80,80,80]]
所以对于这个网格,我想返回50

我的问题是模式匹配和从网格中提取RGB值

returnFirstRed (G xs) = (head xs) !! 0 
结果是RGB值而不是int值

我已经尝试了很多不同的方法来获得r值,但我无法让它发挥作用,而且我在网上任何地方都找不到类似的例子。我正在努力学习Haskell,对在这里做什么很迷茫

你想要的是

returnFirstRed (G ((RGB x _ _):_):_)) = x
请注意,x是RGB中的第一个元素,它是一个列表的头,它是另一个列表的头,它是G中唯一的元素

当然,您可以根本不使用模式匹配,也可以使用一些模式匹配,或者它们之间的任何中介。实践中的一个例子是:

returnFirstRed (G x) = extractFromRGB $ head $ head x
  where extractFromRGB (RGB y _ _) = y

无需使用
head
即可进行模式匹配!!0
(顺便说一句,
头部被认为更好)
[1,2,3]
1:2:3:[]
(在
ghci
中尝试)的语法糖,因此您可以将列表头与
x:rest
匹配,如果您不需要其余部分,只需
x:\u

但是,如果输入列表为空,您会为
returnFirstRed(G[[])
返回什么?我建议返回一个
也许
,这样您就可以为空列表的输入返回
Nothing

returnFirstRed :: Grid RGB -> Maybe Int
returnFirstRed (G (((RGB r _ _):_):_)) = Just r
returnFirstRed _ = Nothing

要使代码正常工作,需要做的最小更改是对提取的
RGB
值进行模式匹配

returnFirstRed (G xs) = let RGB x _ _ = (head xs) !! 0 in x
请注意,
headxs
xs!!0
,如果要更统一地编写:

returnFirstRed (G xs) = let RGB x _ _ = xs !! 0 !! 0 in x

定义访问器方法

red,green,blue :: RGB -> Int
red (RGB r _ _) = r
green (RGB _ g _) = g
blue (RGB _ _ b) = b

first :: Grid a -> [a]
first (G as) = head as
现在你可以写作了

> grid = G [[RGB 50 50 50, RGB 100 200 200], [RGB 75 75 75, RGB 80 80 80]]

> red $ head $ first grid
50

示例值中的逗号太多:
G[[RGB 50 50 50,RGB 100 200 200],[RGB 75 75 75,RGB 80 80]
没有
那么糟糕!!0,但仍应避免。非常感谢您的帮助!这工作做得很好!非常感谢你!非常感谢你的帮助!非常感谢。这很有效!