2016-04-12 2 views
0

У меня есть эти типы данные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.

Моя проблема соответствия модели и извлечения значения RGB из сетки.

Ведение

returnFirstRed (G xs) = (head xs) !! 0 

результаты в RGB Value, а не INT

Я пробовал много разных способов, чтобы получить значение г, но я не могу заставить его работать и I не может найти аналогичный пример в Интернете. Я пытаюсь научиться Haskell и довольно потеряли на том, что делать здесь ..

+3

У вас слишком много запятых в образце: 'G [[RGB 50 50 50, RGB 100 200 200], [RGB 75 75 75, RGB 80 80 80]]'. – chepner

ответ

2

Что вы хотите

returnFirstRed (G ((RGB x _ _):_):_)) = x 

Обратите внимание, что х является первым элементом внутри RGB, который является главой список, который является заголовком другого списка, который является единственным элементом внутри G.

Вы, конечно, могли бы НЕ использовать сопоставление шаблонов вообще или использовать какое-либо сопоставление шаблонов или любое промежуточное звено между ними. Примером того, что на практике будет:

+0

Спасибо! это отлично поработало! – bfergs

7

Вы можете шаблон соответствовать всем пути вниз без использования head или !! 0 (из которых head считается гораздо лучше, кстати). [1,2,3] является синтаксическим сахаром для 1:2:3:[] (попробуйте его в ghci), чтобы вы могли сопоставить главу списка с x:rest, и если вам не нужны остальные, просто x:_.

Но что вы возвращаете для returnFirstRed (G [[]]), то есть если список ввода пуст? Вместо этого я предложил бы вернуть Maybe, поэтому вы можете вернуть Nothing для ввода пустого списка.

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

'head' не так плохо, как' !! 0', но его все равно следует избегать. – leftaroundabout

+0

Большое вам спасибо за помощь! Это сработало отлично! – bfergs

2

Наименьшее изменение, чтобы сделать, чтобы получить код рабочего является шаблон матча на выведенном RGB значения.

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

Обратите внимание, что head xs такое же, как xs !! 0, если вы хотите написать, что более равномерно:

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

Большое вам спасибо! – bfergs

1

определить свои методы доступа

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 
+0

Большое вам спасибо за помощь! – bfergs

Смежные вопросы