(->)
- это тип функции, и люди обычно произносят его как «в» (то есть a -> b
будет произноситься «от a до b»).
(->)
- это примитивная конструкция, встроенная в GHC: компилятор обрабатывает ее специально. Тем не менее, некоторые инструменты, такие как :i
, которые работают с нормальными типами см поддельного определением (->)
, как если бы это был пустой тип данных:
data (->) a b
Это позволяет :i
дать вам информацию о встроенной операции, как если бы это было нормальное определение.
(->) a b
синтаксиса версия префикса из имени инфиксного, так же, как вы можете определить нормальные операторы в виде префикса:
a ~+ b = a * b + b
таким же, как
(~+) a b = a * b + b
Если вы на самом деле попытались определение (->)
таким образом, вы бы получили ошибку:
<interactive>:20:1-13: error:
Illegal binding of built-in syntax: (->)
Однако можно определить пустые типы данных, как это самостоятельно, если вы даете им действительное имя:
data Foo a b
Это делает Foo
типа с двумя (фантомных) аргументов, не имеет значения, кроме ⊥, так же, как Void
от Data.Void
.
Если вы хотите играть с синтаксисом инфиксной, можно определить оператор типа с включенным расширением TypeOperators
, с тем же значением, как Foo
:
data a +~ b
или
data (+~) a b
Этот может быть полезно, если, например, мы хотим эмулировать OCaml и записать парную модель как a * b
, а не (a, b)
:
type a * b = (a, b)
'(+) a b' эквивалентно' a + b' на уровне выражения. '(->) a b' эквивалентно' a -> b' на уровне типа. Обертка выражения инфикса в круглых скобках заключается в том, как вы пишете его в префиксе. –