Синтаксис типа данных Haskell с манипуляцией

#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)