Sum of Products
では、レコード関数をどのように取得しますか?レコードのデータ型を持つ以下の例のコード(ghc 7.10.3
):一般的なSOPでレコード関数を取得する
{-# LANGUAGE DeriveGeneriC#-}
import qualified GHC.Generics as GHC
import Generics.SOP
data Rec = Rec { frec :: Int, srec :: Maybe String}
deriving (Show, GHC.Generic)
instance Generic Rec -- empty
instance HasDatatypeInfo Rec
は、私たちはGHCiのプロンプトでDataTypeInfo
を見てみましょう:frec
とsrec
はコンストラクタFieldInfo
を持っているタイプFieldInfo
の両方であることを我々は見
*Main> datatypeInfo (Proxy :: Proxy Rec)
ADT "Main" "Rec" (Record "Rec" (FieldInfo "frec" :* (FieldInfo "srec" :* Nil)) :* Nil)
ましたfieldName
を文字列として受け取ります。だから、私は実際の機能を得るための方法が表示されませんfrec :: Rec -> Int
とsrec :: Rec -> Maybe String
。私もshow exampleを見ましたが、レコード機能は使用していません。
レコード機能を取得する方法についての説明をお待ちしています(タイプHList '[(Rec -> Int), (Rec -> Maybe String)]
のHList)。私がレイアウトしているuser2407038アプローチを使用して突起のうち、機能を取得する方法について型ノットで縛られています質問
へ
補遺。だから、私はさらに、問題に追加したいとします:どのように我々はRec
コンストラクタにSOP
アプローチを使用して以下のような機能を構築します - 私たちは、レコードのフィールド名と同様に、ここでの機能の両方を使用します。
[ ("frec" ++) . show . frec, ("srec" ++) . show . srec]
fieldInfoを無視して投影自体を取得しても、レコード関数を取得するのに十分ではありませんか?あなたが言ったように、ここでの「投影」のタイプは 'NP '[コードレコーディング - > Int、コードレコーディング>多分文字列]'です。また、 'Rep a = SOP I(Code a))'。それを 'to 'とペアにすると、' Rec - > Int'という関数、 'no'が' a'になるはずです。だから私は ':*:'の必要性について混乱している。さらなる洞察をここで感謝します。 – Sal
また、 'ghci'の' projections'の型をどう計算しましたか?そのステップは実験に非常に役立ちます。 – Sal
ああ申し訳ありません - あなたは関数*と*の名前が必要だと思った。確かに、 'NP(( - >)t)r'を持つことができます - それは単なる関数です。また、一般的なタイプの理解に基づいて、GHCiのタイプを計算しませんでした。しかし、もちろん、ghciに尋ねることもできます。 ':projections ::(Code Rec〜 '[xs])=> NP(Projection f xs)xs' - 型は' projections'の一般的な型であり、制約は質問で使われたものと同じです。 ':: NP(Projection f '[Int、Maybe String])' [Int、Maybe String]'と言っています。 – user2407038