Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 用代数数据类型来形成大阶循环群有没有简单的方法?_Algorithm_Haskell_Functional Programming - Fatal编程技术网

Algorithm 用代数数据类型来形成大阶循环群有没有简单的方法?

Algorithm 用代数数据类型来形成大阶循环群有没有简单的方法?,algorithm,haskell,functional-programming,Algorithm,Haskell,Functional Programming,例如,要在Haskell中创建一个N阶循环组,您可以为大整数定义一个类型,data BigInt=B0 BigInt | B1 BigInt | B,以及通常的add/mod操作。然后,您可以定义op a b=mod(add a b)n,以获得订单的加法组n。问题是add和mod的实现相对复杂,涉及复杂的状态传递递归和进位等。是否有更直接、更自然的方法仅使用数据类型创建循环组?例如: data T = A T T | B T T | C 是否可以为允许我们定义此类组的数据类型定义相对简单的ad

例如,要在Haskell中创建一个N阶循环组,您可以为大整数定义一个类型,
data BigInt=B0 BigInt | B1 BigInt | B
,以及通常的
add
/
mod
操作。然后,您可以定义
op a b=mod(add a b)n
,以获得订单的加法组
n
。问题是
add
mod
的实现相对复杂,涉及复杂的状态传递递归和进位等。是否有更直接、更自然的方法仅使用数据类型创建循环组?例如:

data T = A T T | B T T | C

是否可以为允许我们定义此类组的数据类型定义相对简单的
add::T->T->T
?我一直在尝试一些树旋转方案,但似乎要生成一个周期很长的操作并不容易。

您必须这样定义数据类型吗?Haskell已经支持带有
Integer
的任意精度整数,因此为您的类型定义
newtype BigInt=BigInt Integer
,然后定义适当的
Num
Integral
等实例会简单得多。您可能希望使用智能构造函数
mkBigInt::Integer->BigInt
,以确保
BigInt
值从范围
0]开始。。n-1
。这不是我的意思,我特别想问的是,单独使用数据类型是否可行。Integer在后台使用FFI。BigInt/T是如何表示循环组的元素的?所有循环组都与整数同构-那么这只是表示没有机器整数的整数吗?那么
(Nat,Nat)
其中
(n,m):=n-m
-或者甚至
(Bool,Nat)
。这样的定义不是很有效(但与机器整数相比,任何整数的归纳定义都不是),而是有简单的算术运算。这不太正确。所有(有限)循环群的集合同构于自然:每个群都可以用群中元素的数量来表示。大小为n的任何给定循环组的元素/动作集就是大小为n的集合。