[英]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
实例已正确实现,即),但仅当您选择a
和b
作为相同类型时; 否则,它将从一个Enum
实例转换为另一个Enum
实例。
至于为什么在那个特定的地方使用它:我真的不知道。 B64.decode
和B64.encode
似乎都是String -> String
,而b64Decode
和b64Encode
也是String -> String
,所以toEnum . fromEnum
toEnum . fromEnum
从Char
转换为Char
- 所以在这种情况下它应该与id
相同。 换句话说, toEnum . fromEnum
toEnum . fromEnum
在这里什么都不做,可能应该被删除(尽管我不排除Char
的Enum
实例以不是id
的方式实现的可能性)。
编辑: @KABuhr 在项目的 Git 历史中找到了对此的解释。 似乎encode
和decode
曾经具有涉及ByteString
签名,因此toEnum
和fromEnum
用于在Word8
列表(对于ByteString
)和Char
列表(对于String
)之间进行转换。 在某些时候, encode
和decode
被切换为使用String
而不是ByteString
,但没有人删除toEnum
和fromEnum
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.