如何在 Haskell 数据类型中使用整数文字和算术
How to use integer literals and arithmetic within Haskell data kinds
我最近开始摆弄 DataKinds
以便拥有用于算术的编译时科学单位。我或多或少找到了一种方法来做我想做的事,但我觉得它可以更干净。
我需要可能为负数 (m^-1) 的整数,所以我决定使用整数而不是自然数。但事实证明,当您执行 :k 5
时,它会为您提供 GHC.Types.Nat
,这不符合我的需要。我最终改为创建自己的自定义代数整数类型。以及定义与它一起使用的加法和减法类型族。
但这一切似乎都非常间接,似乎没有充分的理由说明为什么我不能直接使用所有现有函数在编译时在类型族内操作数据。
基本上我希望自动生成以下内容:
type family (a :: Int) + (b :: Int) :: Int where
-- Should be automatically derivable from (+) applied to Int
这可能吗,如果不可能那为什么不呢?
还有一种简单的方法可以从类型中获取运行时值吗?特别是在为所有这些类型编写一个 Show
实例时,我基本上只想引入表示单位组合的幻像类型并将其转换为字符串。我现在能想到的所有方法似乎都很冗长。
看来这个问题的答案很简单,您目前无法自动执行这些操作。希望在这种事情成为可能之前不会花太长时间。
我最近开始摆弄 DataKinds
以便拥有用于算术的编译时科学单位。我或多或少找到了一种方法来做我想做的事,但我觉得它可以更干净。
我需要可能为负数 (m^-1) 的整数,所以我决定使用整数而不是自然数。但事实证明,当您执行 :k 5
时,它会为您提供 GHC.Types.Nat
,这不符合我的需要。我最终改为创建自己的自定义代数整数类型。以及定义与它一起使用的加法和减法类型族。
但这一切似乎都非常间接,似乎没有充分的理由说明为什么我不能直接使用所有现有函数在编译时在类型族内操作数据。
基本上我希望自动生成以下内容:
type family (a :: Int) + (b :: Int) :: Int where
-- Should be automatically derivable from (+) applied to Int
这可能吗,如果不可能那为什么不呢?
还有一种简单的方法可以从类型中获取运行时值吗?特别是在为所有这些类型编写一个 Show
实例时,我基本上只想引入表示单位组合的幻像类型并将其转换为字符串。我现在能想到的所有方法似乎都很冗长。
看来这个问题的答案很简单,您目前无法自动执行这些操作。希望在这种事情成为可能之前不会花太长时间。