2016-10-04 5 views
2

Я знаком с декларацией ньютайпов:Новый тип объявления функций?

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

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

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

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

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

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

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

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

Это компилирует, но я не понимаю, почему я не прошло " a 'параметр?

+1

Не добавляйте новые вопросы к существующей почте. Тем не менее, пример «a» является примером использования [фантомного типа] (https://wiki.haskell.org/Phantom_type). – chepner

ответ

5

Это похоже на объявление функции?

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

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


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

newtype MyWrapper a = MyWrapper a 

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

newtype MyFunction = MyFunction (Float -> Float) 

Вы также можете написать выше, с использованием синтаксиса записи, которая дает вам " геттер ".

+0

Как я могу изменить это объявление newtype в объявлении нормальной функции? –

+0

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

+0

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

Смежные вопросы