1

我正在尝试开始使用 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 是字符串,而不是标签,因此无法编译此代码。有没有合适的方法来实现这一目标?谢谢。

4

2 回答 2

3

这在语义上等同于依赖类型(getter 函数的结果类型取决于字符串的值),所以我猜在 Haskell 类型系统中这是不可能的。

于 2014-11-20T12:16:55.647 回答
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)
于 2014-12-21T23:28:41.647 回答