如何使用haskell类型系统来描述关系,从而防止出现更多错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用haskell类型系统来描述关系,从而防止出现更多错误相关的知识,希望对你有一定的参考价值。
在这个程序中,我如何使用类型系统来阻止imposter_d进行类型检查,这样我就可以编写检查关系假设的函数。在这里,我“意外地”编写了imposter_d,以便错误地组合不相关的项目。
是否有一些类型系统功能(可能有额外的类,数据类型,新类型等),我可以使用它来构造和销毁,以便Haskell允许d和d'进行类型检查而不是imposter_d - 可能基于某些类型参数虽然对于b和c,或者对于b'和c',已知其确切类型不可知是相同的,但对于b和c',不能知道它们是相同的类型?
我想避免为我使用构造的每个地方定义额外的类型 - 因此怀疑通用量化可能是解决方案的一部分。
module Foo where
import Control.Applicative
construct = id
destruct = id
tx = ZipList . reverse . getZipList
a = ZipList [1,2,3]
a' = tx a
b = construct a
c = (+1) <$> b
d = (-) <$> c <*> b
e = destruct d
-- same thing but for data in a different arrangement
b' = construct a'
c' = (+1) <$> b'
d' = (-) <$> c' <*> b'
e' = destruct d'
-- mixed the two arrangements together by mistake!!! oops, help me haskell!
imposter_d = (-) <$> c' <*> b
imposter_e = destruct imposter_d
main = do putStrLn $ show e
putStrLn $ show e'
putStrLn $ show imposter_e
e和e'都是ZipList [1,1,1],但是imposter_e是不同的,我想阻止自己错误地定义它。我很欣赏我可能需要一个新的类型来进行仿函数和应用操作,其中假设相关项。
答案
根据这个评论:
没有办法提供参考透明度并允许分析自引用图。如果您可以确定两个引用是否指向同一个位置,那么您正好违反了引用透明度
也就是说,根据Haskell设计的基本原则,我不能以这种方式做我想做的事情。
以上是关于如何使用haskell类型系统来描述关系,从而防止出现更多错误的主要内容,如果未能解决你的问题,请参考以下文章