gpt4 book ai didi

haskell - 定义了一个类型族(++);有什么方法可以证明 (vs++ us) ~ '[] implies (vs ~ ' []) 和 (us ~ '[])?

转载 作者:行者123 更新时间:2023-12-01 08:27:08 26 4
gpt4 key购买 nike

定义:

type family (xs :: [*]) ++ (ys :: [*]) where
'[] ++ ys = ys
(x ': xs) ++ ys = x ': (xs ++ ys)

我的 GADT 有点像

data Foo :: [*] -> * -> * where
Foo0 :: a -> Foo '[] a
Foo1 :: Foo '[a] a
Foo2 :: Foo vs a -> Foo us a -> Foo (vs ++ us) a

我想做一些类似的事情

test :: Foo '[] Int -> Int
test (Foo0 x) = x
test (Foo2 x y) = test x + test y

但我不能在 xy 上使用 test 因为 x ~ Foo '[] Int并且 y ~ Foo '[] Int 必须被证明。但我想说的是,这从 vs++ us ~ '[] 意味着单独的 vsus 的事实证明了这一点xy 必然是 '[]

有没有办法用类型族来做到这一点,或者可以切换到使用fundeps的多参数类型类方法?

谢谢!

最佳答案

Don't touch the green smile!

The presence of ‘green slime’ — defined functions in the return types of constructors — is a danger sign.

最简单的解决方法是泛化test,然后实例化:

gtest :: Foo xs Int -> Int
gtest (Foo0 x) = x
gtest (Foo2 x y) = gtest x + gtest y

test :: Foo '[] Int -> Int
test = gtest

关于haskell - 定义了一个类型族(++);有什么方法可以证明 (vs++ us) ~ '[] implies (vs ~ ' []) 和 (us ~ '[])?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31472057/

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