如何使用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是不同的,我想阻止自己错误地定义它。我很欣赏我可能需要一个新的类型来进行仿函数和应用操作,其中假设相关项。

答案

根据这个评论:

https://softwareengineering.stackexchange.com/questions/279316/what-exactly-makes-the-haskell-type-system-so-revered-vs-say-java#comment605791_279362

没有办法提供参考透明度并允许分析自引用图。如果您可以确定两个引用是否指向同一个位置,那么您正好违反了引用透明度

也就是说,根据Haskell设计的基本原则,我不能以这种方式做我想做的事情。

以上是关于如何使用haskell类型系统来描述关系,从而防止出现更多错误的主要内容,如果未能解决你的问题,请参考以下文章

Haskell 中的单子——洪峰老师讲创客道(三十五)

如何在整个 Web 应用程序堆栈中利用 Haskell 类型安全性?

在Haskell中,如何创建具有多种类型的列表?

Haskell 类型安全的空间使用

Haskell 数据类型实例作为运算符

Haskell入门篇七:类型类