2010-09-20 89 views
3

我正在使用getOpts查看this example,其中一部分确实令我困惑:字段标签的语法。Haskell字段标签如何工作?

首先,这看起来很简单,创建一个数据类型和声明的初始值:

data Options = Options { optVerbose :: Bool 
         , optInput  :: IO String 
         , optOutput  :: String -> IO() 
         } 

startOptions :: Options 
startOptions = Options { optVerbose = False 
         , optInput  = getContents 
         , optOutput  = putStr 
         } 

然后getOpt用于使用foldl命令要经过选择和确定实际参数为正在运行的程序...然后这让表情让我很沮丧:

let Options { optVerbose = verbose 
      , optInput = input 
      , optOutput = output } = opts 

布尔和功能verboseinputoutput这之后接着使用。在大多数编程语言,我比较熟悉,这一步就写东西,像这样:

verbose = opts.optVerbose 
input = opts.optInput 
output = opts.optOutput 

这里是Haskell的行为记录在某处?

+1

这里有一点补充文件:http://en.wikibooks.org/wiki/Haskell/ Pattern_matching#Introduction_to_records – sclv 2010-09-21 00:41:02

+0

谢谢你所有的好答案! – 2010-09-21 19:00:36

+0

有趣的是:与Brendan Eich讨论JavaScript未来的这段视频展示了一个关于“解构”的幻灯片,其中看起来像是在11:17左右类似的东西。 :) http://hacks.mozilla.org/2010/07/brendan-eich-at-jsconf-2010-whats-coming-in-ecmascript-5-and-more/ – 2010-09-22 07:58:23

回答

9

这只是正常pattern-matching - 当你写let (x:xs) = someList并将其分配的第一个元素x和列表来xs其他人只是喜欢。

如果你愿意,你可以写:

let verbose = optVerbose opts 
    input = optInput opts 
    output = optOutput opts 

模式匹配无处不在Haskell和ML系列,而不是在其他语言一样普遍。

1

基本上,名称只是用于从数据类型(记录)中获取数据的函数。记录只是一种带有一些语法糖的数据类型,用于自动生成可以将数据提取出来的函数。我不确定它是如何实际执行的。

您可以在opts上应用optVerbose以获取optVerbose的值。

optVerbose opts 
5

这是用于定义,设置和获取/使用记录定义的数据类型的值的标准Haskell语法。例如,在给定的值x :: a和功能g :: a -> a记录

data R a = R {v :: a, 
       f :: a -> a} 

可以创建的类型为R a的值,由字段

r = R {v = x, f = g} 

值可以通过以下方式来访问:

get_v :: R a -> a 
get_v = v 

get_f :: R a -> a -> a 
get_f = f, 

也就是说,get_f = fget_v = v。可以使用大括号以类似的方式设置值:

set_v :: R a -> a -> R a 
set_v r a = r {v = a} 

set_f :: R a -> (a -> a) -> R a 
set_f r g = r {f = g} 

即,,set_vset_f是相同的

record {field = value} 

其中field是自动生成功能的Haskell提供用于访问记录字段,和值是所希望的值。可以使用这些操作访问和设置使用记录定义的数据类型中的字段值。示例中的let表达式正在创建类型为Options的值并设置其字段的值。

(我敢肯定,我没有错,但如果我是...)

+0

但这是什么类型'R a' ?显然这个类型只是'R',这个'a'是什么? – 2015-02-03 10:28:39