Haskell中如何用uncurry函数从四元组创建EmailConfig记录?
如何用
uncurry处理Haskell中的四元组映射 Haskell标准库的uncurry仅支持二元组,但你可以通过嵌套使用uncurry或者自定义uncurry4函数来处理四元组的场景,以下是具体实现:
方案1:自定义uncurry4函数(最直观)
标准库的uncurry是为二元组设计的,我们可以仿照它的逻辑实现支持四元组的版本:
import Data.UUID (UUID) import qualified Data.ByteString as B -- 修正类型别名的命名冲突问题(原代码中数据类型与类型别名同名会编译报错) type EmailConfigTuple = (UUID, B.ByteString, B.ByteString, B.ByteString) data EmailConfig = EmailConfig { id :: UUID, fromName :: B.ByteString, fromEmail :: B.ByteString, apiKey :: B.ByteString } deriving (Show) -- 自定义四元组版本的uncurry uncurry4 :: (a -> b -> c -> d -> e) -> (a, b, c, d) -> e uncurry4 f (a, b, c, d) = f a b c d -- 直接使用uncurry4 + 记录构造函数得到目标映射函数 mapperFn :: EmailConfigTuple -> EmailConfig mapperFn = uncurry4 EmailConfig
这个方案逻辑清晰,完全延续uncurry的设计思路,是处理多元组映射的通用写法。
方案2:嵌套使用标准uncurry
如果你不想自定义函数,可以通过把扁平四元组转换成嵌套二元组,然后多次应用uncurry:
mapperFn :: EmailConfigTuple -> EmailConfig mapperFn (w, x, y, z) = uncurry (uncurry (uncurry EmailConfig)) (w, (x, (y, z)))
逻辑解释:
EmailConfig是柯里化的四参数函数,类型为UUID -> B.ByteString -> B.ByteString -> B.ByteString -> EmailConfig- 第一次
uncurry:将其转换为接受(UUID, B.ByteString)与后续两个参数的函数 - 第二次
uncurry:进一步转换为接受((UUID, B.ByteString), B.ByteString)与最后一个参数的函数 - 第三次
uncurry:最终转换为接受嵌套二元组(UUID, (B.ByteString, (B.ByteString, B.ByteString)))的函数,匹配我们转换后的元组结构
内容的提问来源于stack exchange,提问作者Harshal Patil
相关产品推荐
相关产品推荐

