2016-09-07 3 views
3

Для (->) мы имеем:Что означают данные (->) a b?

Prelude> :i (->) 
data (->) t1 t2   -- Defined in ‘GHC.Prim’ 

Что этот синтаксис означает? Я думал, что ключевому слову объявления требуется конструктор типа в LHS и один или несколько конструкторов значений на RHS?

И как (->) вообще говорят или произносятся?

+1

'(+) a b' эквивалентно' a + b' на уровне выражения. '(->) a b' эквивалентно' a -> b' на уровне типа. Обертка выражения инфикса в круглых скобках заключается в том, как вы пишете его в префиксе. –

ответ

11

(->) - это тип функции, и люди обычно произносят его как «в» (то есть 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) 
Смежные вопросы