Haskell中返回Either类型的toRNA函数递归实现问题
Haskell递归构建RNA字符串的错误修复
你的代码问题出在递归调用的处理上:toRNA xs返回的是Either Char String类型,而非直接的String,因此无法直接用:把字符拼在它前面。需要先处理递归返回的结果,再完成字符串拼接。
修复方案1:手动模式匹配递归结果
import qualified Data.Map as Map toRNA :: String -> Either Char String toRNA [] = Right "" toRNA (x:xs) = case getRna x of Nothing -> Left x Just rnaCode -> -- 先处理剩余字符串的递归结果 case toRNA xs of Left err -> Left err -- 传递第一个错误字符 Right rest -> Right (rnaCode : rest) -- 拼接当前字符和递归得到的字符串 getRna :: Char -> Maybe Char getRna c = Map.lookup c rnaMap rnaMap :: Map.Map Char Char rnaMap = Map.fromList [ ('G', 'C') , ('C', 'G') , ('T', 'A') , ('A', 'U') ]
修复方案2:利用Functor特性简化代码
Either属于Functor类型,我们可以用<$>(fmap)将拼接函数应用到递归结果的Right值上,自动完成错误分支的传递:
import qualified Data.Map as Map toRNA :: String -> Either Char String toRNA [] = Right "" toRNA (x:xs) = case getRna x of Nothing -> Left x Just rnaCode -> (rnaCode :) <$> toRNA xs -- fmap自动处理Left/Right分支 getRna :: Char -> Maybe Char getRna c = Map.lookup c rnaMap rnaMap :: Map.Map Char Char rnaMap = Map.fromList [ ('G', 'C') , ('C', 'G') , ('T', 'A') , ('A', 'U') ]
验证效果
- 输入
toRNA "GCT"会返回Right "CGA",符合预期。 - 输入
toRNA "CXL"时,遇到'X'会直接返回Left 'X',不会继续处理后续字符。
内容的提问来源于stack exchange,提问作者HuntressMain
相关产品推荐
相关产品推荐

