在这个程序中,我如何使用类型系统来阻止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是不同的,我想阻止自己错误地定义它。我很欣赏我可能需要一个新的类型来进行仿函数和应用操作,其中假设相关项。
答案 0 :(得分:0)
根据这条评论:
没有办法提供参考透明度并允许分析自引用图。如果您可以确定两个引用是否指向同一个位置,那么您正好违反了引用透明度
也就是说,根据Haskell设计的基本原则,我不能以这种方式做我想做的事。