a f @In-6ren">
gpt4 book ai didi

haskell - Haskell 中的 "Pattern-matching"类型

转载 作者:行者123 更新时间:2023-12-05 08:14:47 24 4
gpt4 key购买 nike

我想要一个函数 f 作为 Int 的增量并作为所有其他类型的标识。我尝试启用 TypeApplications 扩展并以最直接的方式执行此操作:

f :: forall a. a -> a
f @Int x = x + 1
f @_ x = x

但是扩展没有启用这样的模式:

<interactive>:6:1: error: Parse error in pattern: f @Int

Haskell 中有类型模式匹配(或类似机制)吗?

最佳答案

如前所述,这在 Haskell 中是不可能实现的,因为它会违反称为“参数性”的参数多态性的基本属性之一,这确保任何多态函数满足称为“自由定理”的特定属性。

特别是类型的终止函数forall a。 a -> a 必须是标识。没有其他可能的实现。

也就是说,如果我们允许对类型 a 进行约束,这就成为可能。通常,运行时类型测试是通过 Typeable 类型类在 Haskell 中完成的:

f :: forall a. Typeable a => a -> a
f x = case eqT @a @Int of -- Is a ~ Int ?
Just Refl -> x + 1 -- If it is, we can add one.
Nothing -> x -- Otherwise, return x as-is.

这需要一堆 GHC 扩展,并导入 Data.Typeable .

关于haskell - Haskell 中的 "Pattern-matching"类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67197710/

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