gpt4 book ai didi

haskell - 如何使用函数类型依赖来导出类型参数的相等性?

转载 作者:行者123 更新时间:2023-12-04 20:31:28 24 4
gpt4 key购买 nike

考虑以下代码:

{-# LANGUAGE RankNTypes, MultiParamTypeClasses, FunctionalDependencies #-}

data St t = St
{ use_t :: t
}

class S s t | s -> t
where -- Nothing really

newtype P s = P
{ unP :: forall b t. (S s t) =>
St t
-> (St t -> b) -- pok
-> b
}

f :: (S s t) => t -> P s
f t = P $ \s pok -> pok s { use_t = t }

代码看起来很人为,但想法是类 S用于表示类型参数 t由类型参数 s 决定,所以我不必添加 t作为类型参数 P .

然而,上面的代码简而言之给出了以下错误 Could not deduce (t1 ~ t) from the context (S s t) or from (S s t1) .此错误消息表明编译器想要使用这些上下文中的一个或另一个,而我本来希望它会同时使用这两个并得出结论 t1 ~ t从他们。

如果不添加 t,我将不胜感激。作为类型参数来输入 P .

最佳答案

你不能用书面的类(class)来做到这一点。见 Can I magic up type equality from a functional dependency? .但是你可以用不同的类来做到这一点:

class t ~ T s => S s t where
type T s :: *

您需要定义 T对于每个实例,但至少这并不难。您可以提供 T 的默认定义如果有合适的。

关于haskell - 如何使用函数类型依赖来导出类型参数的相等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45396096/

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