Функции объявления нового типа?

#haskell #types

#haskell #типы

Вопрос:

Я знаком с объявлением newtype:

 newtype MyAge = Age {age :: Int} deriving (Show, Eq, Ord)
  

В данном случае Age — это значение Int, однако я наткнулся на приведенный ниже код и не могу его понять:

 newtype Ages a = Ages {age :: String -> [(a,String)]}
  

Похоже, это объявление функции? (принимает строку, возвращает список кортежей, содержащих ‘a’ и string) — это правильно?

N.B Я только что понял, что это просто базовый синтаксис записи для объявления функции.

Кроме того, я пытался реализовать этот тип, но, должно быть, я делаю что-то не так:

 newtype Example a = Example {ex :: Int -> Int}

myexample = Example {ex = (x -> x   1)}
  

Это компилируется, однако я не понимаю, почему, поскольку я не передал параметр ‘a’?

Комментарии:

1. Не добавляйте новые вопросы к существующему сообщению. Тем не менее, Example a это пример использования фантомного типа .

Ответ №1:

Похоже, это объявление функции?

ДА. В частности, String -> [(a,String)] это тип функции. newtype Объявление аналогично простой оболочке вокруг любого заданного типа. Нет ограничений, которые говорят, что вы не можете создать его на основе типа функции, и он работает точно так же.

Также помните, что вы всегда можете заменить newtype на data ; в этом случае может быть полезно подумать о результирующем типе как о типе записи, который имеет поле, являющееся функцией; newtype это просто особый, оптимизированный случай.


Еще одна вещь, которую следует упомянуть, это то, что ваши две строки также отличаются тем, что вторая параметризована a . Это, конечно, можно использовать с обычными типами:

 newtype MyWrapper a = MyWrapper a
  

или тип функции может быть newtype -d без параметризации

 newtype MyFunction = MyFunction (Float -> Float)
  

Вы также можете написать выше, используя синтаксис записи, который также предоставляет вам функцию «getter».

Комментарии:

1. Как я могу изменить это объявление newtype на обычное объявление функции?

2. @barbrac Вы имеете в виду объявление функции или псевдоним обычного типа? Если последнее, просто используйте type .

3. @barbrac вот как вопрос должен выглядеть с самого начала. Пожалуйста, избегайте внесения изменений, которые существенно меняют область Q / A.