gpt4 book ai didi

haskell神奇的代码,这里发生了什么

转载 作者:行者123 更新时间:2023-12-01 22:58:57 26 4
gpt4 key购买 nike

我正在查看 Cloud Haskell 包的 Encoding.hs ,并遇到了一些奇怪的代码,我希望有人可以帮助我更好地理解。包括必要的代码:

class (Binary a,Typeable a) => Serializable a
instance (Binary a,Typeable a) => Serializable a

data Payload = Payload
{
payloadType :: !ByteString,
payloadContent :: !ByteString
} deriving (Typeable)

serialDecodePure :: (Serializable a) => Payload -> Maybe a
serialDecodePure a = (\id ->
let pc = payloadContent a
in pc `seq`
if (decode $! payloadType a) == show (typeOf $ id undefined)
then Just (id $! decode pc)
else Nothing ) id

我只是好奇$!确实如此(我猜只是严格评估),以及为什么我们需要 id 技巧(具有惰性评估的东西?)。另外,我对这一行特别有问题:

if (decode $! payloadType a) == show (typeOf $ id undefined)

我猜测这是为了查看有效负载类型是否因某种原因无效,但如果是这种情况,则不应切换 then 和 else 子句,即更改:

if (decode $! payloadType a) == show (typeOf $ id undefined)
then Just (id $! decode pc)
else Nothing

if (decode $! payloadType a) == show (typeOf $ id undefined)
then Nothing
else Just (id $! decode pc)

感谢您提供的任何帮助。

最佳答案

你说得对,$! 是一个严格的求值器。它的类型与 $ 相同,唯一的语义差异是第二个参数在传递给函数之前经过 seq 处理。

我认为id实际上是为了帮助类型推断。在功能 block (\id -> ...) 中,函数 id 被强制具有类型 a -> a,其中 a 不仅仅是任何类型变量,而是与中的 a 相同

serialDecodePure :: (Serializable a) => Payload -> Maybe a

这是由于这一行:

Just (id $! decode pc)

因为它的类型为Maybe a,所以id具有推断的类型a -> a。因此,在您正在查看的线路上,

if (decode $! payloadType a) == show (typeOf $ id undefined)

id undefined::a,其中 a 再次与输出相同。

现在我们可以进行类型检查了。由于此函数是多态的并且将解码为任何类型,因此它需要检查编码数据是否与其解码的类型兼容。如果您对 String 进行编码并尝试解码为 Int 该怎么办? LHS 将解码为“[Char]”,它是字符串的 TypeRep 表示形式。 RHS 将改为“Int”,即它尝试解码的类型。由于它们不相等,因此“else”路径是返回 None 的路径。

除了这种 id 函数类型限制之外,您还可以使用 ScopedTypeVariables 扩展来完成同样的事情。

关于haskell神奇的代码,这里发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7408911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com