gpt4 book ai didi

haskell - 将 Nat 从类型族调用转换为 Integer

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

import Data.Singletons
import Data.Singletons.TypeLits

type family N t :: Nat where
N Int = 42
N String = 9

foo :: (n ~ N t) => t -> Integer
foo _ = fromSing (sing :: Sing n)

失败

• Could not deduce: DemoteRep * ~ Integer
from the context: n ~ N t
bound by the type signature for:
foo :: n ~ N t => t -> Integer
at mini.hs:16:1-32
• In the expression: fromSing (sing :: Sing n)
In an equation for ‘foo’: foo _ = fromSing (sing :: Sing n)

如何修复它?

最佳答案

您的代码有两个问题。首先,(sing::Sing n) 范围内没有 n。您需要显式 forall 才能将其纳入范围。

其次,如果你想要SingI,你需要这么说。 GHC 不知道也不会检查所有 tN t 是否为 SingI,顺便说一句,这实际上不是真的: N Bool 具有 Nat 类型,但没有 SingI (N Bool)

因此,解决方案:

foo :: forall t. SingI (N t) => t -> Integer
foo _ = fromSing (sing :: Sing (N t))

或者使用类型应用程序:

foo :: forall t. SingI (N t) => t -> Integer
foo _ = fromSing (sing @_ @(N t))

关于haskell - 将 Nat 从类型族调用转换为 Integer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44469481/

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