Кактус уже блестяще обратился к любому вопросу возможно, у вас возникла проблема с выполнением функции 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 функцию, которая
- принимает функцию
f
, которая отображает строки для значений некоторого типа a
.
- принимает строку
- принимает значение этого типа
a
- возвращает новую функцию того же типа, как
f
.
Таким образом, actAsig
выполняет функции: выполняет функции и возвращает новые, возможно, измененные функции.
Кроме того, в Haskell также имеет (несколько основных) средств fuzzying линии между typelevel и значением уровнем, путем вычисления в типе областях включают ссылки (зависимости) в уровень значения, но это выходит из сфера этого сообщения, и приведет нас в мир Dependent Types и Dependent Type Theory.
Тип 'actAsig' выглядит довольно странно (почему он принимает аргумент типа' a'?), И мне трудно понять язык вопроса. – dfeuer
@dfeuer Мне кажется, что они используют (String -> a) как карту, и этот actAsig должен быть похож на «put», добавляя новое отображение на передний план. например 'actAsig f k v x | x == k = v | иначе = f x'. – amalloy
'put :: (Name, a) -> Assignation a -> Assignation a' сделает смысл намного более очевидным. –