haskell - Haskell中由常量参数化的数据类型

标签 haskell types dependent-type data-kinds parameterized-types

我想在 Haskell 中定义一个由 Int 参数化的数据类型沿线恒定:data Q (n :: Int) = Q n (Int,Int) -- non-working code为了允许我定义以下类型的函数:

addQ :: (Q n)->(Q n)->(Q n)
addQ (Q k (i1,j1)) (Q k (i2,j2))) = Q k (i1+i2,j1+j2)
这个想法是,通过这种方式,我可以限制添加到 Q具有相同 n 的.直觉上,感觉这应该是可能的,但到目前为止,我(诚然是新手)的所有尝试都搁浅在 GHC 的严格要求上。

最佳答案

正如评论所说,这可以通过 DataKinds 扩展实现(从技术上讲,没有它可以实现非常相似的东西,但它非常不符合人体工程学)。

{-# LANGUAGE DataKinds, ExplicitForAll, KindSignatures #-}

import GHC.TypeLits (Nat)
data Q (n :: Nat) = Q Int

addQ :: forall (n :: Nat). Q n -> Q n -> Q n
addQ (Q x) (Q y) = Q (x + y)
let q1 = Q 1 :: Q 3
    q2 = Q 2 :: Q 3
in addQ q1 q2
-- => Q 3 :: Q 3
如果你把 KnownNatn 的约束(也来自 GHC.TypeLits )您还可以获得 n作为常规术语,使用 natVal 功能。

关于haskell - Haskell中由常量参数化的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66641316/

相关文章:

Haskell 函数生成随机数,每次该数字都与前一个不同

json - 如何强制 Servant 返回 JSON 错误而不是纯字符串?

dictionary - F# 类型匹配 - 无法创建映射或匹配记录

idris - 为什么 Idris 会给我以下代码的类型不匹配错误?

haskell - 什么时候指定空导出列表会有用?

haskell - 图结构中的并查找

python - 如何知道函数返回类型和参数类型?

file - 强制 dlmread 返回 uint8 矩阵 - 可能吗?

haskell - 孔类型分辨率不稳定

dependent-type - 如何在 Idris 中重写函数体,以便类型对应于函数签名并且整个事物都可以编译