gpt4 book ai didi

haskell - 为多个类型变量定义约束

转载 作者:行者123 更新时间:2023-12-05 00:46:55 25 4
gpt4 key购买 nike

在我的代码库中,我有几种具有不同数量类型变量的类型。

例如,考虑

data MyType a b c = ...
data MyOtherType a b c d e = ...

然后我使用这些类型定义函数,我想要求每个类型变量都是 Show 的一个实例。 .

为了避免太多重复,我使用了 ConstraintKinds定义类型
type Show2 a b = (Show a, Show b)
type Show3 a b c = (Show2 a b, Show c)
type Show4 a b c d = (Show3 a b c, Show d)
type Show5 a b c d e = (Show4 a b c d, Show e)

以便在我的函数定义中我可以使用
f :: (Show5 a b c d e) => MyOtherType a b c d e -> ...

现在我的问题是:有没有办法简化类型的定义 Show2 , ..., Show5 ?看起来他们的定义是递归的,我想知道是否有一个扩展允许我一次性定义它们

最佳答案

您可以使用类型系列和类型级别的类型列表。

{-# LANGUAGE TypeFamilies, DataKinds, TypeOperators #-}

import Data.Kind

type family ShowN (xs :: [*]) :: Constraint
type instance ShowN '[] = ()
type instance ShowN (t ': ts) = (Show t, ShowN ts)

foo :: ShowN '[a, b, c] => a -> b -> c -> String
foo xa xb xc = show xa ++ " " ++ show xb ++ " " ++ show xc

main :: IO ()
main = putStrLn (foo 3 True 'f')

关于haskell - 为多个类型变量定义约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53114614/

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