gpt4 book ai didi

haskell - 如何在没有 DataKinds 的情况下使值依赖于其他值?

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

我有一个 Universe 类型和一个 Worker 类型。 worker 可以改变宇宙。我想要实现的目标是确保宇宙只能由来自该宇宙的 worker (而不是 future 或过去的 worker )进行修改。

我能达到的最好成绩是:

{-# LANGUAGE DataKinds       #-}
{-# LANGUAGE KindSignatures #-}

module Module(initialUniverse, doSomething, doStep) where

data Nat = Z | S Nat

data Universe (t :: Nat) = Universe {
_allWorkers :: [Worker t]
}

data Worker (t :: Nat) = Worker

initialUniverse :: Universe Z
initialUniverse = Universe [Worker]

doSomething :: Worker t -> Universe t -> Universe (S t)
doSomething = undefined

doStep :: Universe t -> Universe (S (S t))
doStep u = let w = head $ _allWorkers u
u2 = doSomething w u
w2 = head $ _allWorkers u2
u3 = doSomething w2 u2
in u3

如果我将 w2 = head $_allWorkers u2 更改为 w2 = head $_allWorkers u 我会收到一个编译错误,这正是我想要的。

我不太喜欢的是,现在我有一个附加到每个宇宙的版本,并且我必须手动增加它。可以用另一种不需要显式版本控制的方式来完成此操作吗?比如让 doSomething 函数返回一个 Universe otherType,其中类型检查器会知道 otherTypet 不同。

感谢您的宝贵时间。

最佳答案

一种方法是使用存在类型:

data Un = forall s. Un (Universe s)

doSomething :: Worker s -> Universe s -> Un

initialUniverse :: Un


doStep :: Un -> Un
doStep (Un u) = let w = head $ _allWorkers u
u2 = doSomething w u
w2 = head $ _allWorkers u2
u3 = doSomething w2 u2
in Un u3

关于haskell - 如何在没有 DataKinds 的情况下使值依赖于其他值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32121688/

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