繁体   English   中英

在Haskell中为部分应用类型创建数据构造函数

[英]Create data constructor for partially applied type in Haskell

是否可以在Haskell中为部分应用类型创建数据构造函数?

ghci会话:

Prelude> data Vector a b = Vector {x::a, y::b}
Prelude> :t Vector
Vector :: a -> b -> Vector a b
Prelude> type T1 = Vector Int
Prelude> :t T1
<interactive>:1:1: Not in scope: data constructor `T1'
Prelude> let x = Vector
Prelude> let y = T1
<interactive>:46:9: Not in scope: data constructor `T1'

我想为T1类型创建数据构造函数 - 它甚至可能吗? 或者我是否必须使用newtypes,因为无法手动定义此类函数?

我对你的目标有点困惑,但让我们一点一点地经历这一点,也许我会说得对:

:t告诉你变量的类型; 应用于类型时没有任何意义,因为它只会返回您传递的内容。 注意这里的错误告诉你:t期望某种数据值作为参数:

Prelude> :t Maybe

<interactive>:1:1: Not in scope: data constructor `Maybe'
Prelude> :t (Maybe Integer)

<interactive>:1:2: Not in scope: data constructor `Maybe'

<interactive>:1:8: Not in scope: data constructor `Integer'

可以创建部分类型:

Prelude> type T = Maybe
Prelude> Just 5 :: T Integer
Just 5

type T a = Maybe a -- alternately, with explicit type parameters
Prelude> Just 'a' :: T Char
Just 'a'

无法为部分类型创建数据构造函数 ,因为它们不表示数据。 没有在类型上进行参数化, MaybeVector有什么值? 您可能倾向于认为Maybe可能具有Nothing的值,但是Nothing输入为:

Prelude> :t Nothing
Nothing :: Maybe a

关键是Nothing可以是任何 Maybe a ,但它仍然需要a知道它Nothing (有点像我告诉你“给我拿一杯”而不是“给我一杯任何东西” - 你至少在完成我的想法之后才能有效地遵守)。

您当然可以创建部分应用的函数 ,这些函数 在应用后将返回完整类型:

Prelude> let f = Just :: a -> T a
Prelude> f 5
Just 5
Prelude> :t f 'a'
f 'a' :: T Char

GADT可以做到这一点。 GHCi会议:

λ :set -XGADTs
λ :{
| data Vector a b where
|     Vector :: a -> b -> Vector a b
|     T1 :: Int -> b -> T1 b
| type T1 = Vector Int
| :}
λ :t T1
T1 :: Int -> b -> T1 b

已有T1的构造函数,它名为Vector

*Main> :t Vector :: Int -> b -> T1 b
Vector :: Int -> b -> T1 b :: Int -> b -> T1 b
Prelude> type T1 = Vector Int

这将为Vector Int创建一个类型构造函数。 请注意,此处Vector用作类型构造函数,因为您提供了类型参数。 您可以查询的那种类型的T1:k

Prelude> :k T1
T1 :: * -> *

这告诉您T1是一个类型构造函数,它采用具体类型( * )并返回一个具体类型。

要创建数据构造函数,需要为Vector 数据构造函数的第一个参数提供数据值:

Prelude> let t1 = Vector 5
Prelude> :t t1
t1 :: b -> Vector Integer b

(请注意, Vector既是类型*构造函数,也是数据构造函数,因为您在data声明的左侧和右侧使用了相同的名称。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM