3
我已經構造了一個Vinyl記錄的簡單示例。首先,一些語言編譯指示和進口:乙烯:rtraverse帶有需要所有字段共享的約束的函數
{-# LANGUAGE DataKinds, TypeOperators #-}
import Data.Vinyl
import Data.Vinyl.Functor
import Control.Applicative
實際例子(它採用爲了簡單起見,HList類型同義詞):
mytuple :: HList [Integer,Bool]
mytuple = Identity 4 :& Identity True :& RNil
這將編譯確定。但現在我想打印使用rtraverse黑膠唱片:
printi :: Show a => Identity a -> IO (Identity a)
printi (Identity x) = print x *> pure (Identity x)
main :: IO()
main = rtraverse printi mytuple *> pure()
這提供了以下錯誤:No instance for (Show x) arising from a use of ‘printi’
。預計我猜想,因爲rtraverse
預計沒有約束的函數。
如何解決這個問題?看起來reifyConstraint
將成爲解決方案的一部分,但我不知道如何使用它。
啊,我明白了。所以'Dict'是一個GADT,它上面的模式匹配可以讓你恢復匹配結果的'Show'約束? – danidiaz 2015-04-05 14:44:45
就是如此。 – user2407038 2015-04-05 14:46:02