gpt4 book ai didi

haskell - 具有可变参数数量的构造函数

转载 作者:行者123 更新时间:2023-12-02 14:02:40 25 4
gpt4 key购买 nike

使用一些扩展,我可以做这样的事情:

{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}

type family TF (a :: Bool) where
TF 'True = Int
TF 'False = Double

data D a where
D :: TF a -> D a

注意构造函数D 可以通过两种方式工作。要么:

D :: Int -> D 'True

D :: Double -> D 'False

使用这种模式,我可以根据构造函数的类型完全更改构造函数的参数,同时重用它的名称。

但是,我还希望参数的数量取决于它的名称。

我知道我可以用 ()Void 替换一些参数,但我宁愿完全删除它们。

有办法做到这一点吗?

最佳答案

我不确定这是否正是 @luqui 在上面的评论中所想的,但是您可以在类型类中创建一个智能构造函数,该构造函数根据其第一个参数的类型(或任何固定数量的初始参数)进行分派(dispatch)参数)通过类型族确定剩余参数的数量和类型:

{-# LANGUAGE TypeFamilies #-}

data D = Int2 Int Int
| Double1 Double
deriving (Show)

class D1 a where
d :: a -> T2 a
type family T2 a where
T2 Int = Int -> D
T2 Double = D

instance D1 Int where
d x = \y -> Int2 x y -- or just `d = Int2`
instance D1 Double where
d x = Double1 x -- or just `d = Double1`

之后:

> d (2 :: Int) 3
Int2 2 3
> d (2 :: Double)
Double1 2.0
>

我不清楚如何将其推广到需要条件调度的情况:

data D = IntStringDouble Int String Double
| Int2 Int Int
| Double1 Double
deriving (Show)

因为你需要类似的东西:

T2 Int = a -> T3 a

使用 T3 为调度的下一步提供一个额外的类型系列,我认为没有任何方法可以使类型系列的 RHS 具有多态性。也许其他人可以找到办法。

无论如何,这可能带来的麻烦多于它的值(value)。

关于haskell - 具有可变参数数量的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44380767/

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