http://hackage.haskell.org/package/vinyl提供的可扩展记录与其他库(HList 和可能的其他库,如葡萄柚记录/记录)提供的不同。这是因为查找的结果是基于 pair (result type, label)
,而其他库的查找仅基于label
。乙烯基发生这种情况的一个例子:
{-# LANGUAGE DataKinds, TypeOperators #-}
import Data.Vinyl
r = fixRecord $ (Field :: "x" ::: a) =: (3::Double)
<+> (Field :: "x" ::: a) =: (2::Int)
main = do
print $ rGet (Field :: "x" ::: Int) r
print $ rGet (Field :: "x" ::: Double) r
-- prints 2\n3
对于我的应用程序http://hackage.haskell.org/package/Rlang-QQ,记录元素的类型将由它们稍后的用法决定,所以我似乎需要“x”来唯一确定值存储在那里。
我想避免表达式中的“冗余”类型签名
(rGet (Field :: "z" ::: [Double])
(ans :: PlainRec ("z" ::: [Double] ': '[])))
让它看起来更像:
(rGet (Field :: "z" ::: [Double]) ans)
整个代码在http://code.haskell.org/~aavogt/Rlang-QQ/examples/test2.hs 有没有办法使用乙烯基来实现这一点,或者我应该调整我的代码以使用另一个库?