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