2015-11-05 2 views
1

У меня есть тип последующей:Понимание синонимов типа и параметризованные синонимы типа в Haskell

type Name = String 

type Assignation a = Name -> a 

и следующее объявление функции:

actAsig :: Assignation a -> Name -> a -> Assignation a 

Эта функция должен возвращать новый Assignation, который возвращает вновь назначенным значение для поставленного Name и ранее назначенные значения для других Name с.

+1

Тип 'actAsig' выглядит довольно странно (почему он принимает аргумент типа' a'?), И мне трудно понять язык вопроса. – dfeuer

+3

@dfeuer Мне кажется, что они используют (String -> a) как карту, и этот actAsig должен быть похож на «put», добавляя новое отображение на передний план. например 'actAsig f k v x | x == k = v | иначе = f x'. – amalloy

+0

'put :: (Name, a) -> Assignation a -> Assignation a' сделает смысл намного более очевидным. –

ответ

3

Кактус уже блестяще обратился к любому вопросу возможно, у вас возникла проблема с выполнением функции actAsig, однако я чувствую, что вопросы в заголовке сообщения остались без внимания.


Прежде всего, Haskell имеет как язык уровня (значение Object Language) и язык уровне типа (Metalanguage). Они оба могущественны, но обычно не одинаково мощны, по крайней мере, не для одних и тех же вещей. Однако некоторые вещи работают с обеих сторон, такие как константы, переменные и функции.

постоянный уровня типа:

type Name = String 

- это обычно называется «тип псевдоним»: это означает, что Name выполнен в (почти) всех отношениях, эквивалентных String. Это не представляет новый тип, только новое имя для существующего типа. Это полезно для того, чтобы сделать ваш код более читабельным, если вы не хотите вводить новый тип с data или newtype, и в этом случае вы вводите новый набор значений, которые необходимо сопоставить и существующие наборы значений (т.е. типы). Поэтому type - это просто удобство, если хотите, а не меру безопасности, а это то, что для data и newtype.

Однако язык уровня типа Haskell также поддерживает функции, то есть сопоставления от 1 или более типов к некоторому существующему типу. Вы могли бы считать это параметрическим псевдонимом, так сказать.

type Assignation a = Name -> a 

Это создает функцию типа под названием Assignation с параметром a. Учитывая тип a, он возвращает некоторый тип, в данном случае тип Name -> a. Таким образом, Assignation Int возвращает Name -> Int; Assignation Person возвращает Name -> Person и так далее.Обратите внимание, что иногда тип функции не делают использование одного или нескольких из их параметров, так же, как функции уровня значений:

type Empty a =() 

Если объединить эти новые знания, мы можем начать думать с точки зрения уровня типа оценки/уменьшения , то есть оценка, которая только занимает места в пределах границ сигнатуры типа, типа функций, типа класса ограничений вычислений и т.д.

Давайте применим это к типу подписи actAsig, шаг за шагом:

Assignation a -> Name -> a -> Assignation a 
Assignation a -> String -> a -> Assignation a 
(Name -> a) -> String -> a -> (Name -> a) 
(String -> a) -> String -> a -> (String -> a) 

Так тип функции более высокого порядка, который вы видите на последней строке выше, является фактическим типом actAsig, все абстракции удалены/уменьшены.

С точки зрения человека язык, подпись descirbes функцию, которая

  1. принимает функцию f, которая отображает строки для значений некоторого типа a.
  2. принимает строку
  3. принимает значение этого типа a
  4. возвращает новую функцию того же типа, как f.

Таким образом, actAsig выполняет функции: выполняет функции и возвращает новые, возможно, измененные функции.


Кроме того, в Haskell также имеет (несколько основных) средств fuzzying линии между typelevel и значением уровнем, путем вычисления в типе областях включают ссылки (зависимости) в уровень значения, но это выходит из сфера этого сообщения, и приведет нас в мир Dependent Types и Dependent Type Theory.

+0

Спасибо за объяснение, это было действительно полезно, чтобы понять поведение типа в этом контексте. Очень ясный и последовательный ответ. –

+0

Рад, что я мог бы помочь! –

7

Спецификация actAsig, если я понимаю правильно, это то, что дано

assignation1 :: Assignation a 
newName :: Name 
newValue :: a 

assignation2 = actAsig assignation1 newName newValue 

Требование о assignation2 что

assignation2 name = if name == newName then newValue else assignation1 name 

Таким образом, вы можете написать это именно так:

actAsig :: Assignation a -> Name -> a -> Assignation a 
actAsig assignation1 newName newValue name = 
    if name == newName then newValue else assignation1 name 
+1

Я до сих пор не вижу намерения OP при рассмотрении вопроса в заголовке ... –

+0

@ErikAllik: Есть ли флаг, чтобы поместить его в очередь «улучшения»? – Cactus

+0

Я был просто озадачен, чтобы узнать, что OP действительно хочет знать ... У меня все в порядке, как есть ... –

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