2010-09-20 88 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