gpt4 book ai didi

haskell - 具有私有(private)类型的类型签名

转载 作者:行者123 更新时间:2023-12-04 12:41:11 25 4
gpt4 key购买 nike

好的,这是语言的一个不起眼的角落:

Haskell 允许您导出类型签名中提到未导出类型的标识符。这到底是什么语义?

例如,假设我有

module Foobar (bar) where

data Foo = ...

bar :: String -> Foo
Foo未导出,而 bar是。 bar的类型提到 Foo , 尽管。许多编程语言不允许你这样做,但 Haskell 可以。

所以现在怎么办?看来我可以调用 bar ,但对其结果无能为力。特别是,我(大概)不能说出结果类型的名称,这有点奇怪。大概如果模块导出了一些函数,这些函数需要 Foo作为输入,我应该能够以我的结果作为输入来调用那些......但是我不能在类型签名中这么说。

当然,做上述的事情不是一个好主意。我不建议在实际代码中这样做。我只是好奇它实际上做了什么。

最佳答案

如果 Haskell 禁止您导出您自己的推断 Foo 的类型,这可能会更有趣。 s---这将使这里的情况表现得更像存在类型,这对于模块系统来说是一个好主意。

相反,类型信息泄漏。实例信息也是如此。对于“实例”,以下内容是不安全的

module Foo ( foo ) where

data Foo ...
deriving (Data, Typeable) -- for internal use

foo :: Foo -> IO ()

自从使用 foo将允许“邪恶”用户统一 Data.Data.fromConstr ...Foo即使用户不应该能够生成 Foo值(value)观。
-- mkFoo :: Constr -> Foo       (except I have to let this be inferred)
mkFoo c = out where
out = fromConstr c
ignored = foo out

最终,我认为这是一个糟糕的 API。如果您想强调类型的使用而不允许用户构造它,请导出该类型。

关于haskell - 具有私有(private)类型的类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23444084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com