gpt4 book ai didi

haskell - 为什么我的类型最后有 '-> Constraint' ?

转载 作者:行者123 更新时间:2023-12-04 18:37:26 25 4
gpt4 key购买 nike

我正在阅读的 Haskell 教程有一节介绍了类型 kinds 的基础知识。 ,并描述了一个类型类

class Tofu t where  
tofu :: j a -> t a j

因为有那种
* -> (* -> *) -> *

我明白,但是当我输入 :k Tofu 时在 GHCi 中,我得到
Tofu :: (* -> (* -> *) -> *) -> GHC.Prim.Constraint

什么是 GHC.Prim.Constraint为什么那种 Tofu使用这种形式而不是简单的 * -> (* -> *) -> * ?

最佳答案

t是类 Tofu 的类型参数种类* -> (* -> *) -> * (书面 t :: * -> (* -> *) -> *)。
这是 t 的推断类型由 GHC 因为没有 -XPolyKinds , GHC 尝试将所有类型参数默认为 kind * .因此 GHC 假设 a有种* (尽管您的签名中没有任何内容使这是唯一的选择)。

类型构造函数 (->)有种* -> * -> * .自 j a显示为 (->) 的参数, j a必须有种* .由于 GHC 假设 a有种* , j是一种需要某种东西的类型 *并返回类似的东西 * .因此:

j :: * -> *

t应用于 aj , t有种 * -> (* -> *) -> * , 因为第一个参数 a有种 *和第二个参数 j有种 *->* 、整体型 t a j必须有种 *因为它也是 (->) 类型的参数.

类只是带类型参数的类型(就像 data Foo a b ),除了 Foo a b有种 *Tofu t有种特殊的种类 Constraint .于是那种 Tofu是:
(* -> (* -> *) -> *) -> Constraint

正如 GHC 所示。 Constraint只是给予约束的那种。在签名中
(Num a) => a -> a -> a
(Num a)是一种类型 Constraint .

关于haskell - 为什么我的类型最后有 '-> Constraint' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32142136/

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