从Haskell对象中提取信息

nul*_*omo 2 haskell

我是Haskell的新手,我对如何从函数结果中获取值感到困惑.在我的特定情况下,我试图解析Haskell文件并查看哪些AST节点出现在哪些行上.这是我到目前为止的代码:

import Language.Haskell.Parser
import Language.Haskell.Syntax

getTree :: String -> IO (ParseResult HsModule)
getTree path = do
               file <- readFile path
               let tree = parseModuleWithMode (ParseMode path) file
               return tree

main :: IO ()
main = do
       tree <- getTree "ex.hs"
       -- <do something with the tree other than print it>
       print tree
Run Code Online (Sandbox Code Playgroud)

所以在我有评论的行上,我有一个语法树tree.它似乎有类型ParseResult HsModule.我想要的只是HsModule.我想我正在寻找的功能如下:

extract :: ParseResult a -> a
Run Code Online (Sandbox Code Playgroud)

或者更好的是,一般的Haskell函数

extract :: AnyType a -> a
Run Code Online (Sandbox Code Playgroud)

也许我在这里错过了关于Haskell的一个主要概念?

ps我明白将这些事物视为"物体"并试图从它们中获取"字段"是错误的,但我想解释一下如何处理这类事物.

ama*_*loy 7

寻找类型的一般功能

extract :: AnyType a -> a
Run Code Online (Sandbox Code Playgroud)

确实对Haskell表现出很大的误解.考虑许多事情AnyType,以及如何从中提取一个对象.怎么样Maybe Int?你可以很容易地转换Just 55,但你应该返回Nothing多少?

或者如果AnyType[],那么你有[String]什么?应该是什么结果

extract ["help", "i'm", "trapped"]
Run Code Online (Sandbox Code Playgroud)

或者

extract []
Run Code Online (Sandbox Code Playgroud)

ParseResult有一个类似的"问题",因为它用于ParseOk包含表明一切正常的结果,并ParseFailed指出错误.如果解析成功,则不完整的模式匹配会成功获得结果,但如果实际上解析失败,则会使程序崩溃.通过使用ParseResult,Haskell鼓励你考虑如果你正在分析的代码没有正确解析你应该做什么,而不是只是轻易地假设它会很好.