You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 01:55:18