Синтаксис типов данных Haskell с манипуляциями - PullRequest
0 голосов
/ 20 октября 2011

Я новичок, у которого в прошлом не было опыта функционального программирования (но, тем не менее, немало опыта процедурного / императивного программирования). У меня возникли некоторые проблемы с пониманием того, как объявление вашего собственного типа данных работает.

Например, скажем, я объявил тип данных:

data SomeThing = Int [Int]

как бы вы написали функцию Haskell, которая потребляет someData и создает someData; только Int произведенных данных является суммой всех элементов в [Int] потребленных данных, и где [Int] потребленного значения имеет каждый элемент, умноженный на 2 в произведенном [Int].

Это, очевидно, возможно, но я не нашел ответов, которые имели бы для меня смысл после веб-поиска.

Ответы [ 2 ]

6 голосов
/ 20 октября 2011

Прежде всего, у вас есть ошибка в объявлении типа данных. Из вашего вопроса вам нужен тип данных, который содержит Int и список Int, но вам не хватает конструктора данных 1 . Это метка, используемая при сопоставлении с образцом или при создании новых значений вашего типа данных.

data SomeThing = SomeThingConstr Int [Int]

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

Теперь легко написать свою функцию, используя сопоставление с образцом и этот конструктор данных.

foo :: SomeThing -> SomeThing
foo (SomeThingConstr _ xs) = SomeThingConstr (sum xs) (map (*2) xs)

1 Или, скорее, у вас есть конструктор данных с именем Int, который явно не тот, что вы имели в виду.

1 голос
/ 20 октября 2011

(Цитата из вашего поста, поскольку я подозреваю, что он будет отредактирован.)

Например, скажем, я объявил тип данных:

data SomeThing = Int [Int]

как бы вы написали функцию Haskell, которая потребляет некоторые данные и выдает некоторые данные; только Int полученных данных является суммой всех элементы в [Int] потребляемых данных, и где потребленные значение [Int] имеет каждый элемент, умноженный на 2 в произведенном [Int].

Полагаю, вы имеете в виду тип данных

data SomeData = SomeData Int [Int]

Тогда вы хотите

f :: SomeData -> SomeData
f (SomeData _ ys) = SomeData (sum ys) (map (2 *) ys)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...