为什么这个 HasField 实例没有被解析?
Why is this HasField instance not being resolved?
我正在使用 GHC 8.2.1。我有以下模块:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Moat (Moat,moat) where
import GHC.Records (HasField(..))
newtype Moat r = Moat r
moat :: r -> Moat r
moat = Moat
instance HasField s r v => HasField s (Moat r) v where
getField (Moat r) = getField @s r
还有这个:
module Foo (Foo(..)) where
data Foo a = Foo { getDims :: (Int, Int), getData :: [a] }
我的问题是,当我导入了两个模块并尝试执行如下操作时:
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE DataKinds #-}
import Moat
import Foo
import GHC.Records
oops :: (Int,Int)
oops = getField @"getDims" (moat (Foo (5,5) ['c']))
我收到这个错误:
No instance for (HasField "getDims" (Moat (Foo Char)) (Int, Int))
arising from a use of ‘getField’
为什么 HasField
实例没有被解析?
通过在定义 HasField
实例的 Moat
模块中启用 {-# LANGUAGE PolyKinds #-}
解决了该问题。
我想这与 HasField
typeclass 是 poly-kinded 有关:
λ :info HasField
class HasField k (x :: k) r a | x r -> a where
getField :: r -> a
这允许我们定义 HasField
个像这样的实例,其中字段选择器是非 Symbol
类型:
import GHC.Records
data A = A B
data B = B deriving Show
instance HasField B A B where
getField (A b) = b
在 ghci 中:
λ> getField @B (A B)
B
我正在使用 GHC 8.2.1。我有以下模块:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Moat (Moat,moat) where
import GHC.Records (HasField(..))
newtype Moat r = Moat r
moat :: r -> Moat r
moat = Moat
instance HasField s r v => HasField s (Moat r) v where
getField (Moat r) = getField @s r
还有这个:
module Foo (Foo(..)) where
data Foo a = Foo { getDims :: (Int, Int), getData :: [a] }
我的问题是,当我导入了两个模块并尝试执行如下操作时:
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE DataKinds #-}
import Moat
import Foo
import GHC.Records
oops :: (Int,Int)
oops = getField @"getDims" (moat (Foo (5,5) ['c']))
我收到这个错误:
No instance for (HasField "getDims" (Moat (Foo Char)) (Int, Int))
arising from a use of ‘getField’
为什么 HasField
实例没有被解析?
通过在定义 HasField
实例的 Moat
模块中启用 {-# LANGUAGE PolyKinds #-}
解决了该问题。
我想这与 HasField
typeclass 是 poly-kinded 有关:
λ :info HasField
class HasField k (x :: k) r a | x r -> a where
getField :: r -> a
这允许我们定义 HasField
个像这样的实例,其中字段选择器是非 Symbol
类型:
import GHC.Records
data A = A B
data B = B deriving Show
instance HasField B A B where
getField (A b) = b
在 ghci 中:
λ> getField @B (A B)
B