现实世界哈斯克尔说:
我们将使用新类型隐藏解析器类型的详细信息
宣言
我不明白如何使用新类型隐藏任何内容。谁能详细说明一下吗?我们想要隐藏什么以及我们如何做到这一点。
data ParseState = ParseState {
string :: L.ByteString
, offset :: Int64 -- imported from Data.Int
} deriving (Show)
newtype Parse a = Parse {
runParse :: ParseState -> Either String (a, ParseState)
}
这个想法是将模块+新类型结合起来,以防止人们看到我们如何实现事物的内部结构。
-- module A
module A (A, toA) where -- Notice we limit our exports
newtype A = A {unA :: Int}
toA :: Int -> A
toA = -- Do clever validation
-- module B
import A
foo :: A
foo = toA 1 -- Must use toA and can't see internals of A
这可以防止模式匹配和任意构造A
。这让我们的A
模块做出某些假设A
并且还改变了内部结构A
不受惩罚!
这特别好,因为在运行时newtype
s 被删除,因此执行此类操作几乎没有任何开销
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)