gpt4 book ai didi

haskell - 在具有约束的方法中为 maxBound 类型推断错误

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

我将通过 Get Programming with Haskell,并尝试扩展一些示例。获取 Enum 的 maxBound 的函数有问题:

rotGen :: (Bounded a, Enum a) => a -> (a, Int)
rotGen x = (x, fromEnum (maxBound))

Could not deduce (Bounded a0) arising from a use of ‘maxBound’from the context: (Bounded a, Enum a)

我明白这个问题 - fromEnum (maxBound) 无法弄清楚哪个 Bounded 类型可以得到绑定(bind)。但是我不知道要让编译器知道 它与 x 是同一类型

我尝试了 fromEnum (maxBound::a) - 不起作用。


已解决。

仅供引用。这是 Get Programming with Haskell 一书第 15 课的 ROT13 旋转器的更清晰的实现:

-- gen encoder & decoder for enum 
rotGen :: forall a . (Bounded a, Enum a) => (a -> a, a -> a)
rotGen = (\x -> toEnum ((half + fromEnum x) `mod` max), \x -> toEnum ((upper + fromEnum x) `mod` max))
where
max = 1 + fromEnum (maxBound @a)
half = max `div` 2
upper = max - half

(尽管如主题中所述,语言扩展对于新手来说太高级了)

最佳答案

您可以使用 ScopedTypeVariablesTypeApplications extensions .在这种情况下,我们将 rotGen 定义为:

{-# LANGUAGE <b>ScopedTypeVariables</b>, <b>TypeApplications</b> #-}

rotGen :: <strong>forall a</strong> . (Bounded a, Enum a) => a -> (a, Int)
rotGen x = (x, fromEnum (maxBound <strong>@a</strong>))

通过 ScopedTypeVariables,我们可以在表达式中使用类型参数 a,我们应该使用显式的 forallTypeApplication 扩展将指定我们使用 maxBound 常量的实例。

关于haskell - 在具有约束的方法中为 maxBound 类型推断错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69965760/

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