繁体   English   中英

Haskell 代码中函数 (toEnum . fromEnum) 的用途是什么?

[英]What is the purpose of the function (toEnum . fromEnum) in Haskell code?

我看到了toEnum . fromEnum函数toEnum . fromEnum toEnum . fromEnum被所用Char S IN HaskellNet.Network.Auth

b64Encode :: String -> String
b64Encode = map (toEnum.fromEnum) . B64.encode . map (toEnum.fromEnum)

b64Decode :: String -> String
b64Decode = map (toEnum.fromEnum) . B64.decode . map (toEnum.fromEnum)

乍一看这个函数应该和id ,对吧? 为什么会在这里?

可以等同于id ,但仅限于某些情况。 由于fromEnum :: Enum a => a -> Int可以将任何Enum转换为Int ,并且toEnum :: Enum a => Int -> a可以将Int转换为任何Enum ,因此它遵循toEnum . fromEnum toEnum . fromEnum是从任何enum转换为任何枚举的一般方法-即, (toEnum . fromEnum) :: (Enum a, Enum b) => a -> b 正如您所观察到的,这确实应该与id相同(如果Enum实例已正确实现,即),但仅当您选择ab作为相同类型时; 否则,它将从一个Enum实例转换为另一个Enum实例。

至于为什么在那个特定的地方使用它:我真的不知道。 B64.decodeB64.encode似乎都是String -> String ,而b64Decodeb64Encode也是String -> String ,所以toEnum . fromEnum toEnum . fromEnumChar转换为Char - 所以在这种情况下它应该与id相同。 换句话说, toEnum . fromEnum toEnum . fromEnum在这里什么都不做,可能应该被删除(尽管我不排除CharEnum实例以不是id的方式实现的可能性)。

编辑: @KABuhr 在项目的 Git 历史中找到了对此的解释。 似乎encodedecode曾经具有涉及ByteString签名,因此toEnumfromEnum用于在Word8列表(对于ByteString )和Char列表(对于String )之间进行转换。 在某些时候, encodedecode被切换为使用String而不是ByteString ,但没有人删除toEnumfromEnum

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM