Haskell代数数据类型:选择适配toString1的正确MyTreeInt类型
让MyTree类型与toString1兼容的解决方案
嘿,我来帮你搞定这个Haskell类型兼容的问题~首先得明确:你现在的MyTree定义只是一个简单的枚举类型,没法承载MyTreeInt或者MyTreeString的实际数据,所以才会和处理MyTreeInt的toString1函数不兼容。
先看看你给出的原始代码结构:
module Main( main ) where -- ********** -- * MyTree * -- ********** data MyTree = MyTreeInt | MyTreeString -- ************* -- * MyTreeInt * -- ************* data MyTreeInt = MyTreeIntAtom Int | MyTreeIntPlus MyTreeInt MyTreeInt | MyTreeIntMinus MyTreeInt MyTreeInt -- **************** -- * MyTreeString * -- **************** data MyTreeString = MyTreeStringAtom String -- 补全你省略的构造子示例 | MyTreeStringConcat MyTreeString MyTreeString
问题出在MyTree的定义上:这里的MyTreeInt和MyTreeString只是MyTree的两个空构造子,和你后面定义的同名数据类型完全没有关联。也就是说,你没法把一个MyTreeInt类型的值转换成MyTree类型,自然没法和操作MyTreeInt的toString1配合使用。
修正方案
我们需要修改MyTree的定义,让它的构造子能够包裹对应的树类型实例:
module Main( main ) where -- 修改后的MyTree:用构造子包裹实际的树数据 data MyTree = WrapMyTreeInt MyTreeInt | WrapMyTreeString MyTreeString data MyTreeInt = MyTreeIntAtom Int | MyTreeIntPlus MyTreeInt MyTreeInt | MyTreeIntMinus MyTreeInt MyTreeInt data MyTreeString = MyTreeStringAtom String | MyTreeStringConcat MyTreeString MyTreeString -- 假设你的toString1是处理MyTreeInt的函数,示例实现: toString1 :: MyTreeInt -> String toString1 (MyTreeIntAtom n) = show n toString1 (MyTreeIntPlus a b) = "(" ++ toString1 a ++ " + " ++ toString1 b ++ ")" toString1 (MyTreeIntMinus a b) = "(" ++ toString1 a ++ " - " ++ toString1 b ++ ")" -- 如果需要处理整个MyTree类型的toString函数,可以这样扩展: myTreeToString :: MyTree -> String myTreeToString (WrapMyTreeInt intTree) = toString1 intTree myTreeToString (WrapMyTreeString strTree) = toStringString strTree where toStringString (MyTreeStringAtom s) = s toStringString (MyTreeStringConcat a b) = toStringString a ++ toStringString b
为什么这样改?
现在WrapMyTreeInt这个构造子接受一个MyTreeInt作为参数,相当于把整数树“打包”成了MyTree类型的实例。当你需要调用toString1时,只需要从MyTree里提取出包裹的MyTreeInt值,就能直接传给toString1了——完美解决类型不兼容的问题。
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

