2013-08-23 8 views
16

Lensライブラリで少し遊びたいです。私はGHCiの中にそれをロードし、適切なアンダースコアを持つレコードのデータ型を作成しました:GHCiのレコードからレンズを作る方法

> data Foo a = Foo {_arg1 :: Int, _arg2 :: [a]} 

私はmakeLensesテンプレートを使用してFoo用レンズをしたいと思います。私はTemplate-Haskell docsのセット全体を読む必要なしにこれをしたいと思います。

これを機能させるには、GHCiプロンプトで何を入力すればよいですか?

答えて

14

はGHCiの7.8.3でテスト済み:

:set -XTemplateHaskell 
:m +Control.Lens 
:{ 
data AST = AInt { _aid :: Int, _ival :: Int } 
     | AChar { _aid :: Int, _cval :: Char } 
     deriving (Show) 
makeLenses ''AST 
:} 

(私は:{ ... :}ブロックが仕事にmakeLensesのために必要であると信じています)。

レッツ・簡単にチェック:

λ >> AChar 100 'f' ^. aid 
100 
λ >> AChar 100 'f' ^? cval 
Just 'f' 
λ >> AInt 101 0 ^? cval 
Nothing 
+2

'makeLenses'コールが' *同じ*に行かなければならないことを言及する価値がある:{データ宣言として 'ブロック!それは私がそれを理解するまで私をループのために投げた。 – kqr

+2

:{makeLensesと一緒に}ブロックに_any_ステートメントがあれば十分です(AST宣言である必要はありません)。私が理解する限り、ghciは 'makeLenses'を宣言リストとして展開します。 :{block}に1つのステートメントしかない場合は、expressionとして展開して型の不一致エラーを返します。 – max630

関連する問題