考虑由谓词B
确定的类型A
及其子类型P
。一个实例将是B
的自然数和A
的质数,其中一些素数测试为P
。为这样的A
实现智能构造函数很简单,定义为newtype
或Tagged
。
现在假定子类型谓词在编译时尚未完全确定。例如,假设P
是IO
输入所确定的集合的成员资格:运算符输入整数多项式的系数,并且我们得到一个谓词,该谓词可验证给定数字是否为该多项式的值,一些索引。
我可以确保每个多项式及其验证的值的标记方式均使其相互兼容,而又与任何其他多项式都不兼容吗?所需的是值及其索引之间的转换,我想输入保护它们以避免混淆。
这就是我的想象:
polynomial :: [Integer] -> Polynomial unique
toValue :: Integer -> Polynomial unique -> Value unique
fromValue :: Integer -> Polynomial unique -> Maybe (Index unique)
toValue' :: Index unique -> Value unique
fromValue' :: Value unique -> Index unique
重点是获得后两个 total 函数。
但是我不知道如何定义此polynomial
函数。它将从哪里获得unique
类型?
答案 0 :(得分:1)
要以类似ST的方式进行操作,您需要一个函数库来对export
和Value s
类型进行操作,然后具有一个具有以下类型的函数:
Polynomial s
这会将withPolynomial :: (forall s . Polynomial s -> Integer) -> [Integer] -> Integer
转换为[Integer]
并将其传递给参数函数。然后,该函数将在适当的地方使用您的函数库来执行所需的操作。保证任何Polynomial s
值都不会从封闭的Value s
应用程序中泄漏出来,因此不会混淆。但是,这也将阻止您存储多项式及其值以用于将来的计算。