如何在去除箭头语法后获得haskell代码?

问题描述 投票:0回答:1

我目前正在尝试解决我的问题HXT:输入可以使用箭头语法更改吗?因此希望在 ghc 编译器脱糖箭头语法后查看 haskell 代码。我该怎么做?

我已经尝试过

-ddump-ds
,但是有了这个标志,我得到了一个可怕的长代码,因为所有类型都已解析。有没有一种方法可以仅通过箭头语法脱糖来查看代码?

haskell ghc arrow-abstraction
1个回答
7
投票

原始的 arrow 项目提供了一个名为

arrowp
的解析器,它在 Hackage 上可用,并将箭头语法转换为 Haskell98:

cabal install arrowp
arrowp --help
arrowp source.hs > desugared.hs

示例

来源取自您的其他问题

来源.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 ()
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.