如何在中缀形式中使用类型构造函数

时间:2016-04-22 22:49:28

标签: haskell syntax

我正在浏览some Haskell documentation,并找到了声明

  

您可以将构造函数(用于类型和数据)声明为中缀运算符,这可以使您的代码更具可读性。

我可以使用中缀形式的数据构造函数,如下所示:

Prelude> data List a = Empty | a :-> (List a) deriving Show
Prelude> 
Prelude> let var1 = 10 :-> Empty
Prelude> let var2 = 20 :-> var1
Prelude> let var3 = 30 :-> var2
Prelude> 
Prelude> var1
10 :-> Empty
Prelude> 
Prelude> var2
20 :-> (10 :-> Empty)
Prelude> 
Prelude> var3
30 :-> (20 :-> (10 :-> Empty))

我的问题是如何在中缀形式中使用类型构造函数,有人能给我一个例子来理解这个吗?

2 个答案:

答案 0 :(得分:7)

> :set -XTypeOperators
> data a :-> b = C (a -> b)
> :t C id
C id :: b :-> b

请记住,其名称必须以:开头(粗略地说,:被视为“大写”)。

否则,请使用反引号,如a `T` b

答案 1 :(得分:4)

为了扩展@ chi的答案,使用最近的GHC版本,TypeOperators的语法有所改变:输入构造函数名称,否则将是中缀类型变量名称(即没有前导:的符号仍然被归类为类型构造函数名称,这意味着以下代码可以工作并定义中缀类型构造函数+

{-# language TypeOperators #-}

data a + b = L a | R b