gpt4 book ai didi

haskell - 用于广义多参数函数提升的类型类技巧

转载 作者:行者123 更新时间:2023-12-04 15:34:39 25 4
gpt4 key购买 nike

我想将 Haskell 函数提升为高阶 lambda 演算编码。这几乎是从 Oleg 的 Typed Tagless Final encoding 中逐字记录的。

class Lam r where
emb :: a -> r a
(^) :: r (r a -> r a) -> (r a -> r a)
lam :: (r a -> r a) -> r (r a -> r a)

instance Lam Identity where
emb = Identity
f ^ x = f >>= ($ x)
lam f = return (f . return =<<) -- call-by-value

eval = runIdentity

我可以将任意 Haskell 类型嵌入到 Lam使用 emb ,但我不能使用 (^)然后申请。此外,提升的功能会表现得很懒惰。相反,我必须逐个应用程序来提升它们。
emb1 :: ( Applicative r, Lam r ) 
=> (a -> b) -> r (r a -> r b)
emb1 f = lam $ \ra -> f <$> ra

emb2 :: ( Applicative r, Lam r )
=> (a -> b -> c) -> r (r a -> r (r b -> r c))
emb2 f = lam $ \ra -> lam $ \rb -> f <$> ra <*> rb

emb3 :: ( Applicative r, Lam r )
=> (a -> b -> c -> d)
-> r (r a -> r (r b -> r (r c -> r d)))
emb3 f = lam $ \ra -> lam $ \rb -> lam $ \rc -> f <$> ra <*> rb <*> rc

>>> eval $ emb2 (+) ^ emb 1 ^ emb 2
3

不过,这是很多样板文件。我想创建一个适用于任何 arity 函数的通用提升函数。我觉得可以使用类似于 Printf 的东西的 PrintfTypefixed-vectorCont类型。我可以使用类型函数指定我想要的内容
type family   Low    h      o
type instance Low () o = o
type instance Low (a, h) o = a -> Low h o

type family Lift r h o
type instance Lift r () o = o
type instance Lift r (a, h) o = r a -> r (Lift r h o)

class Emb r h o where
embed :: Low h o -> r (Lift r h o)

instance ( Lam r ) => Emb r () o where
embed = emb

instance ( Lam r, Applicative r, Emb r h o ) => Emb r (a, h) o where
embed = ?

但是我通过这种方法非常卡住,通常是由于注入(inject)问题。我能够通过新类型包装器和作用域类型变量的真正可怕组合来解决注入(inject)性问题,但它从未真正进行过类型检查。

这可以用 Haskell 表达吗?

最佳答案

你可能想看看
Ordinary and one-pass CPS transformation在无标签最终风格。诀窍是在对象语言中概括 Arrow 类型。我们经常使用 Haskell 的事实
类型构造函数 ->对于对象语言中的函数类型(被嵌入)是一种巧合和方便。通常,对象函数不会简单地映射到 Haskell 函数。引用文章中的代码包含ESymantics

-- How to interpret arrows and other types
type family Arr (repr :: * -> *) (a :: *) (b :: *) :: *

class ESymantics repr where
int :: Int -> repr Int
add :: repr Int -> repr Int -> repr Int

lam :: (repr a -> repr b) -> repr (Arr repr a b)
app :: repr (Arr repr a b) -> repr a -> repr b

现在我们有足够的自由来根据特定的 repr 来解释 Arr。引用的文章将 Arr 解释为 CPS 实例。

编辑:事实证明,我们可以实现相同的效果——重新定义对象语言中箭头的含义——无需引入 Arr 类型(存在注入(inject)问题),也无需 ESemantics。上面的链接,普通和一次性 CPS 转换,显示了新代码,使用标准语义并重新解释函数类型构造函数的含义。不再有任何注入(inject)问题。

关于haskell - 用于广义多参数函数提升的类型类技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20128543/

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