#haskell #types #functional-programming
#haskell #типы #функциональное программирование
Вопрос:
Я новичок, не имеющий опыта функционального программирования в прошлом (тем не менее, довольно много опыта процедурного / императивного программирования). У меня возникли небольшие проблемы с пониманием того, как работает объявление вашего собственного типа данных.
Например, скажем, я объявил тип данных:
data SomeThing = Int [Int]
как бы вы написали функцию Haskell, которая использует someData и создает someData; только Int для созданных данных является суммой всех элементов в [Int] используемых данных, и где для [Int] использованного значения каждый элемент был умножен на 2 в полученном [Int].
Это, очевидно, возможно, но я не нашел никаких ответов, которые имели бы смысл для меня после веб-поиска.
Ответ №1:
Прежде всего, у вас ошибка в объявлении типа данных. Из вашего вопроса следует, что вам нужен тип данных, который содержит Int
и список Int
, но вам не хватает конструктора1. Это метка, используемая при сопоставлении с шаблоном или при создании новых значений вашего типа данных.
data SomeThing = SomeThingConstr Int [Int]
Обычно конструктор называют так же, как и сам тип данных, когда существует только один, но я дал им отдельные имена здесь, чтобы избежать путаницы.
Теперь легко написать свою функцию, используя сопоставление с шаблоном и этот конструктор данных.
foo :: SomeThing -> SomeThing
foo (SomeThingConstr _ xs) = SomeThingConstr (sum xs) (map (*2) xs)
1Или, скорее, у вас есть конструктор данных с именем Int
, который, очевидно, не то, что вы имели в виду.
Комментарии:
1. @FrerichRaabe: Не ошибка компиляции, нет, но это явно не то, что хотел OP.
2. @FrerichRaabe OP ссылается на выходные данные как имеющие отдельные
Int
и[Int]
поля.3. @dave4420: Ах, верно. Я неправильно истолковал вопрос (что делает недействительным мой собственный ответ, упс). Спасибо за разъяснение этого.
Ответ №2:
(Цитирую ваш пост, поскольку я подозреваю, что он будет отредактирован.)
Например, скажем, я объявил тип данных:
data SomeThing = Int [Int]
как бы вы написали функцию Haskell, которая использует someData и
создает someData; только Int созданных данных является суммой всех
элементы в используемых данных [Int], и где используемые
значение [Int] имеет каждый элемент, умноженный на 2 в полученном
[Int].
Я полагаю, вы имеете в виду, что тип данных должен быть
data SomeData = SomeData Int [Int]
Тогда вы хотите
f :: SomeData -> SomeData
f (SomeData _ ys) = SomeData (sum ys) (map (2 *) ys)