Создание списков типов данных в Haskell - PullRequest
5 голосов
/ 04 мая 2011

Я очень озадачен тем, как вы должны получать данные из классов типов в haskell.Я приезжаю на Си-би-си, поэтому мне очень трудно, чтобы вы не могли просто получить доступ к данным.У меня есть что-то вроде этого:

data MyType = MyType String deriving (Show)


display :: [MyType] -> IO ()
display ((MyType name):xs) = do
       display xs
       putStr name

По сути, здесь я хочу получить доступ к «имени», но, похоже, это не работает.Могу ли я получить доступ к данным в экземпляре класса типов, просто имея ссылку на объект в моем коде, или мне нужно сопоставить его содержимое с переменными?и если да, то как?

Буду признателен за ссылки на хорошие учебники по этому вопросу, я прочитал «Изучу Хаскелла для хорошего блага», но когда я пытаюсь отклониться от приведенных примеров, всегдамногое мне нужно знать, чтобы сделать это.-

Ответы [ 2 ]

6 голосов
/ 04 мая 2011

Я думаю, что вам, возможно, просто не хватает некоторых маленьких кусочков, которые связывают все это вместе.

Во-первых, у вас есть совершенно точный тип данных MyType, который содержит строки:

data MyType = MyType String deriving (Show)

Теперь вы хотите написать функцию, которая просматривает список такого типа, печатая каждый элемент по мере его поступления.Мы делаем это с помощью рекурсии по типу данных list.

Поскольку списки имеют два регистра, пустой список [] и регистр cons (:), у нас есть две ветви:

display :: [MyType] -> IO ()
display []                 = return ()
display ((MyType name):xs) = do
       putStrLn name
       display xs

Теперь, я думаю, вы, возможно, застряли, собирали данные такого типа.Вы уже знаете, как разобрать это с помощью сопоставления с образцом, и вы строите данные, используя почти тот же синтаксис.Вот список MyType:

table = 
    [ MyType "john"
    , MyType "don"
    , MyType "eric"
    , MyType "trevor"
    ]

Наконец, вы можете запустить вашу программу из main

main = display table

Обратите внимание, здесь нет классов типов, только алгебраические данныетипы (введено с data).

1 голос
/ 04 мая 2011

Прежде всего, я немного смущен словами, которые вы используете. класс типов - это способ перегрузки функций. У вас есть алгебраический тип данных . Проблема у вас (если я правильно понял) хорошо известна. Для упрощения доступа к данным вы можете использовать синтаксис записи :

data Foo = Foo {
    bar :: Int
  , baz :: String
}

Видите ли вы сходство со структурой в C? Используя синтаксис записи, возможны некоторые интересные вещи:

bar y -- access member bar of y
y { bar = z } -- Make a new record but with field bar changed to the value of z

и кое-что еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...