gpt4 book ai didi

haskell - 具有 RankNTypes 的新类型

转载 作者:行者123 更新时间:2023-12-02 06:36:24 26 4
gpt4 key购买 nike

如果我想声明一个 newtype ,使得值的类型类型被限制为具有类型类的实例,似乎我可以这样做:

{-# LANGUAGE RankNTypes #-}

newtype ShowBox = ShowBox (forall a. Show a => a)

GHC 编译得很好,但是当我尝试实际使用 ShowBox

ShowBox "hello"

我收到编译器错误

<interactive>:1:18:
Could not deduce (a ~ [Char])
from the context (Show a)
bound by a type expected by the context: Show a => a
at <interactive>:1:10-24
`a' is a rigid type variable bound by
a type expected by the context: Show a => a at <interactive>:1:10
In the first argument of `ShowBox', namely `"hello"'
In the expression: ShowBox "hello"
In an equation for `a': a = ShowBox "hello"

有办法实现这个功能吗?

最佳答案

您向编译器 promise ,您放入 ShowBox 中的值将具有 forall a 的类型。显示a => a。该类型只有一个可能的值,那就是 _|_。我认为您可能想要一种存在类型,它看起来非常相似,但含义却非常不同。

{-# LANGUAGE ExistentialQuantification #-}

data ShowBox = forall a. Show a => ShowBox a

这必须使用data来完成,而不是newtype。在本例中,构造函数上的模式匹配将 Show 实例引入作用域。由于 newtype 没有运行时表示,因此它们没有地方存储存在量化所暗示的多态见证。

关于haskell - 具有 RankNTypes 的新类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9779301/

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