私は現在、自分の問題を解決しようとしていますHXT: Can an input change with the arrow syntax? したがって、ghc コンパイラーがArrow 構文を desugar した後の haskell コードを見たいと思っています。これどうやってするの?
私はすでに試し-ddump-ds
ましたが、このフラグを使用すると、すべてのタイプも解決されるため、恐ろしい長いコードが得られます。矢印構文の脱糖だけでコードを表示する方法はありますか?
私は現在、自分の問題を解決しようとしていますHXT: Can an input change with the arrow syntax? したがって、ghc コンパイラーがArrow 構文を desugar した後の haskell コードを見たいと思っています。これどうやってするの?
私はすでに試し-ddump-ds
ましたが、このフラグを使用すると、すべてのタイプも解決されるため、恐ろしい長いコードが得られます。矢印構文の脱糖だけでコードを表示する方法はありますか?
元の矢印プロジェクトarrowp
は、Hackageで利用可能なと呼ばれるパーサーを提供し、矢印構文を Haskell98 に変換します。
cabal install arrowp
arrowp --help
arrowp source.hs > desugared.hs
ソースは他の質問から取得されました。
{-# LANGUAGE Arrows #-}
import Text.XML.HXT.Core
data Person = Person { forname :: String, surname :: String } deriving (Show)
parseXml :: IOSArrow XmlTree Person
parseXml = proc x -> do
forname <- x >- this /> this /> hasName "fn" /> getText
surname <- x >- this /> this /> hasName "sn" /> getText
returnA -< Person forname surname
main :: IO ()
main = do
person <- runX (readString [withValidate no]
"<p><fn>John</fn><sn>Smith</sn></p>"
>>> parseXml)
putStrLn $ show person
return ()
arrowp source.hs
{-# LINE 2 "source.hs" #-}
module Main (main) where
{-# LINE 2 "source.hs" #-}
import Text.XML.HXT.Core
{-# LINE 4 "source.hs" #-}
data Person = Person{forname :: String, surname :: String}
deriving Show
{-# LINE 6 "source.hs" #-}
parseXml :: IOSArrow XmlTree Person
{-# LINE 7 "source.hs" #-}
parseXml
= (arr (\ x -> (x, x)) >>>
(first (this /> this /> hasName "fn" /> getText) >>>
arr (\ (forname, x) -> (x, forname)))
>>>
(first (this /> this /> hasName "sn" /> getText) >>>
arr (\ (surname, forname) -> Person forname surname)))
{-# LINE 12 "source.hs" #-}
main :: IO ()
{-# LINE 13 "source.hs" #-}
main
= do person <- runX
(readString [withValidate no] "<p><fn>John</fn><sn>Smith</sn></p>"
>>> parseXml)
putStrLn $ show person
return ()