2017-08-13 5 views
3

私はGHC 8.2.1を使用しています。私は、次のモジュールがあります。このHasFieldインスタンスが解決されないのはなぜですか?

{-# 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 

そして、この他の1:

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インスタンスが解決されないのはなぜですか?

答えて

4

この問題は、HasFieldインスタンスを定義しているMoatモジュールの{-# LANGUAGE PolyKinds #-}を有効にすることで解決します。

私はそれがHasField型クラスは、ポリkindedことに関係していたとします

λ :info HasField 
class HasField k (x :: k) r a | x r -> a where 
    getField :: r -> a 

これは、私たちは、フィールドセレクタが非Symbolタイプで、この1のようなHasFieldインスタンスを定義することができます:

をGHCiの中
import GHC.Records 
data A = A B 
data B = B deriving Show 
instance HasField B A B where 
    getField (A b) = b 

λ> getField @B (A B) 
B 
関連する問題