gpt4 book ai didi

haskell - 使用反射和 DataKinds 进行类型推断

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

我在让 GHC 在一个应该很明显的地方推断出一个类型时遇到了问题。以下是演示问题的完整片段。

{-# LANGUAGE DataKinds, ScopedTypeVariables, KindSignatures, TypeOperators, GADTs #-}

import Data.Reflection
import Data.Proxy
import Data.Tagged

-- heterogeneous list, wrapping kind [*] as *
data HList :: [*] -> * where
HNil :: HList '[]
HCons :: a -> HList as -> HList (a ': as)

main = test2

test1 = do
let x = HCons 3 HNil :: HList '[Int]
c = case x of (HCons w HNil) -> w
print c

test2 = reify True (\(_::Proxy a) -> do

let x = HCons (Tagged 3) HNil :: HList '[Tagged a Int]
c = case x of (HCons w HNil) -> w
print $ untag (c :: Tagged a Int))

test1 , 我可以打印 c不给 c和明确的类型,正如我所期望的。 c的类型由 x 上的显式签名推断:即 HList中的第一个元素有类型 Int .

test2 ,但是, c 上的显式签名是必须的。如果我只是 print $ untag ctest2 ,我得到
Test.hs:22:32:
Couldn't match type `s0' with `s'
`s0' is untouchable
inside the constraints (as ~ '[] *)
bound at a pattern with constructor
HNil :: HList ('[] *),
in a case alternative
`s' is a rigid type variable bound by
a type expected by the context:
Reifies * s Bool => Proxy * s -> IO ()
at Test.hs:19:9
Expected type: Tagged * s0 Int
Actual type: a
In the pattern: HNil
In the pattern: HCons w HNil
In a case alternative: (HCons w HNil) -> w

为什么GHC不能推断 c的类型从给 x 的显式类型如 test1 ?

最佳答案

我发现这些错误与 let-bindings 相关......虽然我不知道确切的原因或者它是否实际上是 GHC 中的错误。解决方法是改用 case 语句:

test4 = reify True $ \ (_::Proxy a) -> do
let x = HCons (Tagged 4) HNil :: HList '[Tagged a Int]
c = case x of (HCons w HNil) -> w
print $ untag (c :: Tagged a Int)

test5 = reify True $ \ (_::Proxy a) -> do
case HCons (Tagged 5) HNil :: HList '[Tagged a Int] of
HCons w HNil -> print $ untag w

关于haskell - 使用反射和 DataKinds 进行类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18710174/

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