レコード構文
さて、レコード構文の続き。
レコード構文では中括弧の中でプロパティ名の様な名前が定義でき、値を作るときにも
name = "tubasa"
の用に使うことができた。
しかし、実は、このnameはただの名前ではない。
実は、対応する値を取り出すことの出来る関数でもある。
すなわち、その2で定義されたdarekaからnameに該当する値を取り出したい時
name dareka とすると、"tubasa"を返してくれる。
saikyou dareka なら 9999 である。
凄くない??!!
defaultConfig {...}とは何者?
さて、値コンストラクタを使って値を定義する方法を見てきた。ここで注意深く見ないとダメなのは、defaultConfigは何か?ってこと。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import XMonad | |
main = xmonad defaultConfig | |
{ terminal = "urxvt" | |
, modMask = mod4Mask | |
, borderWidth = 3 | |
} |
defaultConfigは「d」という小文字で始まっている。
つまり、値コンストラクタではない!!
例えるなら、defaultConfigは
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
data Human = Otoko { name :: String, dokyou :: Int } | |
| Onna { name :: String, aikyou :: Int } | |
| Okama { name :: String, saikyou :: Int } | |
dareka :: Human | |
dareka = Okama { name = "tubasa", saikyou = 9999 } |
で言うところのOkamaではなくて、darekaに該当する。
そもそも、値コンストラクタを使って、値を作成する場合、引数を省略することはできない。その2のはじめでも紹介した通り、defaultConfigに該当するデータ型の持つ項目(引数)の数は15個あるので、3つだけでは値は作れないのだ。
しかし、、、defaultConfigは中括弧を使ったレコード構文っぽいのを使ってるよ?
これがレコード構文のもうひとつ面白いところで以下のようなことが出来る。
chigau_dareka = dareka { name = "akira"}
これは、darekaで定義されている値を元に、一部分だけを変更した新しい値を作っている。なので、chigau_darekaの中身は Okama { name = "akira", saikyou = 9999 }っぽく出来上がっている。
なので、defaultConfigというのは、既にどこかで中身の各項目の値が設定されて定義された値であり、そのデフォルトの値に対してレコード構文を用いて必要な箇所だけを再設定して、新たな値を作り出しているのだった。
あちこちのxmonad.hsを探索する時、defaultConfig以外でも、このレコード構文である中括弧にはよく出くわす。
はじめ、この中括弧部分と周りの関係がちっともわからなかったので、ネットをフラフラと探索して初心者サイトなんかを見ていたんだけれど、全然紹介されているところを見つけられなかった。
なので、このメモ記事で、xmonad設定の取っ掛かりになるといいなと思う。
わかってる人はわかってるんだと思うけれど、単語の始まりが大文字か小文字かに注意することで、それが既に定義された何かか、値コンストラクタかを見分ける事が出来るだけでも、設定ファイルを読んでいく時のコツになると思う。
GHCiで試す
一応、GHCiもメモ
ターミナルからghciで起動。:qで終了。
スクリプト書いた時は、:l ファイル名(.hs拡張子はいらない)で読み込んで:rで再読み込み。
:m XMonadとかするとXMonadモジュール読み込む。
式の型を知りたい時は:t
話題のdefaultConfigは
:t defaultConfig
defaultConfig :: XConfig (Choose Tall (Choose (Mirror Tall) Full))
-- Defined in `XMonad.Config'
XConfigうんたらかんたら型という型でした。