在科特林,我能做到
sealed class Substance {
object Uranus : Substance()
object Mercury: Substance()
object Ammonia : Substance()
}
data class DangerousBox<T : Substance>(val item: T)
fun main() {
val uranus = DangerousBox<Substance.Uranus>(Substance.Uranus)
val mercury: DangerousBox<Substance.Mercury> = uranus
}现在我有了不变类型DangerousBox<Substance.Uranus>, DangerousBox<Substance.Mercury>等等,所以上面的示例不会编译。
在哈斯克尔是怎么做到的?
理想情况下,我想要类型
uranus :: DangerousBox Uranus
uranus = DangerousBox Mercury这个样本也不合适。
我试图通过以下方式实现这一目标:
module Sample.Types.Boxes
( Substance(..)
, dangerousBox
, VDangerousBox {- no Con-}
) where
data Substance
= Uranus
| Mercury
| Ammonia
deriving (Show)
data VDangerousBox a =
VDangerousBox Substance
deriving (Show)
dangerousBox :: Substance -> VDangerousBox Substance
dangerousBox a = VDangerousBox a模块的客户端只能使用dangerousBox,但是这里我有一个关于内容的jeneric:
uranus :: VDangerousBox Substance
uranus = dangerousBox Uranusdata DangerousBox :: Substance -> * where
DangerousBox :: Substance -> DangerousBox a
uranus :: DangerousBox Uranus
uranus = DangerousBox Uranus
mercury :: DangerousBox Mercury
mercury = uranus {- it's ok, it dosn't compile -}但在这种情况下,下面的情况将编译:
mercury :: DangerousBox Mercury
mercury = DangerousBox Ammonia我知道我收到了相当于
data Box<T : Substance>(val value: Substance)就科特林的泛型而言。
这不是真正的案例,它只是“学术”的兴趣。
发布于 2022-07-16 16:54:28
考虑到特定的物质选择,框中不包含任何其他信息(至少在Kotlin代码中是这样),所以我首先考虑完全忽略它:
import Data.Kind (Type) -- preferred version instead of the old *
data DangerousBox :: Substance -> Type where
DangerousBox :: DangerousBox a
uranus :: DangerousBox Uranus
uranus = DangerousBox那么mercury = DangerousBox Ammonia问题甚至不会出现,因为DangerousBox值构造函数不带任何参数。
如果出于某种原因,您确实需要一个表示标记类型的实际值,那么这不应该是标记本身为Type-value,因为在该视图中,Uranus、Mercury和Ammonia都是相同的类型。相反,您应该使用通常称为这些类型的单例。您可以让它们自动生成,也可以手动定义它们:
data SubstanceSing :: Substance -> Type where
UranusS :: SubstanceSing 'Uranus
MercuryS :: SubstanceSing 'Mercury
AmmoniaS :: SubstanceSing 'Ammonia现在,UranusS对应于在值级别上出现的Kotlin Substance.Uranus。你的盒子类型就变成了
data DangerousBox :: Substance -> Type where
DangerousBox :: SubstanceSing a -> DangerousBox ahttps://stackoverflow.com/questions/73005712
复制相似问题