2

関数app :: SnapletInit App Appでは、いくつかのフィールドを持つスナップレットを試しました。

m <- nestSnaplet "mys" mys $ myexInit  -- Data Myex = Myex {_foo :: Text, ...}

後で同じ関数で:

let txt1 = myFun  m    -- myFun :: Myex -> Text    

コンパイラは次のように述べています。

Couldn't match expected type `SnapletLens a0 b0'
            with actual type `Snaplet Myex'

SnapletLenswithを定義しようとしました

class MyLens b where
  myLens :: SnapletLens b Myex

しかし、問題は、myex-snaplet の内容をいつ取得または設定するかということです。そして、myex のフィールドを参照する方法は? 私はいくつかのことを試しました

let txt = (foo . myLens) m

しかし、それらは app メソッドでは機能しませんでした。問題は、 Snaplet のフィールドにアクセスする方法Myexです。レンズのmyFun使用は簡単です。または、少なくともすべてがコンパイルされます。

非常によく似た別の回答を見ました。 スナップレットの初期化中にサブスナップレットを使用しますか?

でも、交換したら

let txt1 = myFun  m    -- myFun :: Myex -> Text    

let txt1 = foo  m    

コンパイラは今言う:

Couldn't match expected type `T.Text -> f0 T.Text'
            with actual type `Snaplet Myex'

pgPool上記のリンクでは、 は へのレンズであると仮定しましたpgs

br gsp

4

1 に答える 1

2

Myexからを取得するには 2 つの方法がありますSnaplet Myex。SnapletタイプにはComonadインスタンスがあり、抽出機能を使用できます。または、Control.Comonad をインポートしたくない場合は、snapletValueレンズを使用できます。

m :: Snaplet Myex
view snapletValue m :: Myex
于 2013-03-11T14:32:13.597 に答える