gpt4 book ai didi

haskell - 使用 UndecidableInstances 可以吗?备择方案?

转载 作者:行者123 更新时间:2023-12-04 17:24:50 27 4
gpt4 key购买 nike

我想在库中做一些魔术,允许多态地解构产品类型。这是一个或多或少的工作模型,说明了我想做的事情:

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances #-} 
newtype Wrapped a = Wrapped { unwrap :: a }

-- our example structure
ex :: (Int, (Int, Int))
ex = (1,(2,3))

class WrapDecomp x y | y -> x where
decomp :: x -> y

instance (WrapDecomp x x', WrapDecomp y y')=> WrapDecomp (x,y) (x',y') where
decomp (x,y) = (decomp x, decomp y)

instance WrapDecomp x (Wrapped x) where
decomp = Wrapped


example = let w = decomp ex
(w0, w1) = decomp ex
(w0', (w1', w2')) = decomp ex :: (Wrapped Int, (Wrapped Int, Wrapped Int))
in print $ ( unwrap w, unwrap w0, unwrap $ snd w1, unwrap $ fst w1 )
-- Also works:
-- in print $ ( unwrap w, unwrap w0, unwrap w1 )

我的实际应用程序是一个库,并且将具有两个属性,使我在上面注意到的疣可以接受:
  • Wrapped类型构造函数未导出
  • 用户将始终调用unwrap全部Wrapped绑定(bind)中的数据(因为我的应用程序的细节很无聊),所以在实践中不应该有歧义

  • 共识似乎是 UndecidableInstances还不错,但我想在继续之前确定以上内容是否符合犹太教规。

    更新/解决方案

    我对此感到困惑,但我能够用 TypeFamilies 解决我的问题如下:
    {-# LANGUAGE TypeFamilies #-}
    class Out a where
    type In a :: *
    decomp :: In a -> a

    instance Out (Wrapped a) where
    type In (Wrapped a) = a
    decomp = Wrapped

    instance (Out a, Out b)=> Out (a,b) where
    type In (a,b) = (In a,In b)
    decomp (x,y) = (decomp x, decomp y)

    最佳答案

    使用UndecidableInstances总的来说,只有犹太洁食,什么UndecidableInstances确实是允许类型检查器在无法提前证明它将完成时尝试解析实例。如果是这样,则代码的安全性不亚于可以提前证明终止的情况。

    但是,对于您的实例,您可以创建一种情况,其中类型检查器将使用导致约束 WrapDecomp x (x,y) 的表达式循环。 , 例如

    foo x = [fst $ decomp x, x]

    使用 fst需要 decomp x输入 (a,b)对于某些类型 ab ,因此是 instance WrapDecomp t (a,b)在哪里 tx 的类型.在同一个列表中需要 x有胶带 a也是,所以一个
    instance WrapDecomp a (a,b)

    第二个参数有一对的唯一实例是
    instance (Wrapdecomp x x', WrapDecomp y y') => WrapDecomp (x,y) (x',y')

    因此 a = (x,y)对于某些类型 xyfoo 的约束变成
    WrapDecomp (x,y) ((x,y),b)

    对实例说如果有实例就有这样的实例
    WrapDecomp y b


    WrapDecomp x (x,y)

    这是我们开始使用的实例的确切形式。

    关于haskell - 使用 UndecidableInstances 可以吗?备择方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11811251/

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