我正在尝试使用HList。是否有一种方法(函数?)以下列方式从字符串生成标签:
{-# LANGUAGE DataKinds #-}
import Data.HList
lb1 = Label :: Label "myLabel1"
lb2 = Label :: Label "myLabel2"
lb3 = Label :: Label "myLabel3"
myRec = lb1 .=. 'a' .*.
lb2 .=. (True, 42 :: Int) .*.
lb3 .=. 3.14 .*.
emptyRecord
main = do putStrLn "what's the label?"
lb <- getLine -- does not work
putStrLn $ "the value for this label is: " ++ show (myRec .!. lb)
return ()
此代码不能编译,因为lb是String而不是Label。有没有正确的方法来实现这一目标?感谢。
答案 0 :(得分:3)
这在语义上等同于依赖类型(getter函数的结果类型取决于string的值),所以我想在Haskell类型系统中这是不可能的。
答案 1 :(得分:1)
我会将myRec
转换为关联列表,因此您可以使用lookup lb (toAssocList myRec)
toAssocList (Record a) = hMapOut ShowFn a :: [(String, String)]
-- unfortunately a bit ugly:
data ShowFn = ShowFn
instance (lv ~ Tagged l v, ShowLabel l, Show v, r ~ (String,String))
=> ApplyAB ShowFn lv r where
applyAB _ (Tagged v) = (showLabel (Label :: Label l), show v)