说我有以下内容:
data Rec = Rec {
alpha :: Int,
beta :: Double,
phi :: Float
}
sample = Rec 1 2.3 4.5
Run Code Online (Sandbox Code Playgroud)
我理解模板Haskell和reify函数可以得到记录的字段名称.那是:
print $(f sample) --> ["alpha", "beta", "phi"]
Run Code Online (Sandbox Code Playgroud)
还有一种说法是,这可以在没有Template Haskell的情况下完成.有人可以为此提供一个示例实现吗?
说我有以下记录:
data Rec = Rec {
field1 :: Int,
field2 :: Int
}
Run Code Online (Sandbox Code Playgroud)
我该如何编写这个函数:
changeField :: Rec -> String -> Int -> Rec
changeField rec fieldName value
Run Code Online (Sandbox Code Playgroud)
这样我可以将字符串"field1"或"field2"传入fieldName参数并让它更新相关字段?我理解Data.Data并且Data.Typeable在这里使用的是什么,但我无法想出这两个包.
我见过的库的一个例子就是cmdArgs.以下是关于如何使用此库的博客文章的摘录:
{-# LANGUAGE DeriveDataTypeable #-}
import System.Console.CmdArgs
data Guess = Guess {min :: Int, max :: Int, limit :: Maybe Int} deriving (Data,Typeable,Show)
main = do
x <- cmdArgs $ Guess 1 100 Nothing
print x
Run Code Online (Sandbox Code Playgroud)
现在我们有一个简单的命令行解析器.一些示例交互是:
$ guess --min=10
NumberGuess {min = 10, …Run Code Online (Sandbox Code Playgroud)