gpt4 book ai didi

haskell - 使用功能依赖的关联参数限制

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

下面的函数 f,对于给定的类型“a”,采用类型“c”的参数。对于不同类型的“a”,“c”以不同的方式进行限制。具体来说,当“a”是任何 Integral 类型时,应该允许“c”是任何“Real”类型。当“a”是浮点数时,“c”只能是浮点数。

一种尝试是:

{-# LANGUAGE
MultiParamTypeClasses,
FlexibleInstances,
FunctionalDependencies,
UndecidableInstances #-}

class AllowedParamType a c | a -> c

class Foo a where
f :: (AllowedParamType a c) => c -> a

fIntegral :: (Integral a, Real c) => c -> a
fIntegral = error "implementation elided"

instance (Integral i, AllowedParamType i d, Real d) => Foo i where
f = fIntegral

出于某种原因,GHC 7.4.1 提示它“无法推断出使用 fIntegral 引起的 (Real c)”。在我看来,功能依赖应该允许这种推论。在实例中,a 与 i 统一,因此通过功能依赖,d 应该与 c 统一,在实例中声明为“Real”。我在这里想念什么?

抛开功能依赖不谈,这种方法的表达能力是否足以强制执行上述限制,还是有更好的方法?我们只为 'a' 使用几个不同的值,因此会出现以下情况:
instance (Integral i, Real c) => AllowedParamType i c
instance AllowedParamType Float Float

谢谢

最佳答案

一种可能更好的方法是使用约束种类和类型系列(我认为 GHC 扩展,需要 GHC 7.4)。这允许您将约束指定为类实例的一部分。

{-# LANGUAGE ConstraintKinds, TypeFamilies, FlexibleInstances, UndecidableInstances #-}

import GHC.Exts (Constraint)

class Foo a where
type ParamConstraint a b :: Constraint
f :: ParamConstraint a b => b -> a

instance Integral i => Foo i where
type ParamConstraint i b = Real b
f = fIntegral

编辑:经过进一步的实验,有一些细微之处意味着这不能按预期工作,特别是 type ParamConstraint i b = Real b太笼统了。我现在不知道解决方案(或者是否存在)。

关于haskell - 使用功能依赖的关联参数限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12399796/

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