gpt4 book ai didi

haskell - 在 Haskell 中隐藏约束

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

如果你使用一些有很多约束的函数

f :: (C_0, ..., C_n) => ....

f用于 g 的定义中,然后 g也需要这些约束。但是,这些约束可能指的是 g不应该知道(因为这可能会泄露有关 f 是如何实现的信息)。隐藏 C_0 ... C_n 是明智之举,假设这是明智之举? ?

我试过类似的东西(请不要扯掉你的头发):
class (C_0, ..., C_n) => CanApplyF 

...

g :: CanApplyF => ...

但是,虽然这可行,但它会导致可简化的类约束警告,敦促我使用单本地绑定(bind)或替换 CanApplyF通过 C_0, ..., C_n .

有没有办法在 Haskell 中实现隐藏约束?

最佳答案

老实说,我认为您所做的应该是正确的方法。其实-Wsimplifiable-class-constraints有点可疑,尽管有时绝对有用。但是,如果了解约束实际上是一种安全风险,那么我敢说这可能是没有希望的。 (另外, don't do that ,但这是另一个讨论。)

可能的解决方法:

  • 制作 CanApplyF不是一个新类,而仅仅是一个约束同义词。
    {-# LANGUAGE ConstraintKinds #-}
    type CanApplyF = (C_0, ..., C_n)

    这应该可行,但无论如何它都不是严格的封装。找出哪些约束是微不足道的 CanApplyF真正包含,事实上(与其他类型的同义词一样)它们可能会在错误消息中意外弹出。
  • 添加一个虚拟方法,就这样CanApplyF从技术上讲,不等同于其父类(super class)的组合。
    class (C_0, ..., C_n) => CanApplyF where
    onlyFUsesThis :: ()

    f = onlyFUsesThis `seq` ...

    (这不能像那样工作,因为该实例是模棱两可的。您需要 -XAllowAmbiguousTypes-XTypeApplications 才能使其工作,或者引入一些 Proxy es。)
  • 关于haskell - 在 Haskell 中隐藏约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62284247/

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