代码之家  ›  专栏  ›  技术社区  ›  user6445533

对于左/右情况,两种类型的构造函数都包含幻影类型吗?

  •  3
  • user6445533  · 技术社区  · 7 年前

    好吧,Haskell中只有类型被值占据,而不是类型构造函数。 Either 是一种二进制类型构造函数 * -> * -> * . Left Right 两者都将此类型构造函数应用于单个类型,该类型由传递的值提供。这不意味着在这两种情况下 任何一个 只是部分应用,因此仍然是一个类型构造函数,等待丢失的类型参数?

    let x = Right 'x' -- Either a Char
    

    x 具有类型 Either a Char . 我认为这种类型的 * -> * 要么是字符 可以被以下价值观占据 'x' .

    我怀疑类型变量 a 是用于 正当 案例响应。 b 对于 . 我知道幻影类型与 Const ,其中根本不使用相应的类型变量。我走对了吗?

    3 回复  |  直到 7 年前
        1
  •  8
  •   leftaroundabout    7 年前

    好吧,Haskell中只有类型被值占据,而不是类型构造函数。

    完全正确

    Left Right 两者都将此类型构造函数应用于单个类型

    你不能这么说。 左边 正当 根本不生活在类型语言中,所以他们不会将任何东西应用于任何类型,他们只将自己应用于 .

    x 具有类型 Either a Char * -> *

    函数/构造函数参数 类型变量 . 这基本上是 free and bound variables . 还有善良 * *->* ,因为它已应用于 a . 是的,这是一个类型变量,但它仍然是一个已经应用的参数。

    然而 要么是字符 可以被以下价值观占据 'x' .

    不完全是这样的价值观 Right 'x' .

    我怀疑类型变量 是用于 正当 案例响应。 b 对于 左边

    有点像,但我不会称之为“幻影”,因为你不能仅仅数出来 左边 正当 . 至少除非你选择 Either Void b ,但在这种情况下,你没有 变量

        2
  •  1
  •   Carl    7 年前

    那么,没有类型的值重要吗 String 出现在值中 Left 5 :: Either Int String ? 一点也不。重要的是 一串 在里面 Either Int String 防止 Right () 来自类型检查。

        3
  •  1
  •   ephrion    7 年前

    Haskell具有“隐式通用量化”,这意味着类型变量具有隐式通用量化 forall . Either a Int 相当于 forall a. Either a Int .

    一种考虑 福尔 这就像lambda,但对于类型变量。如果我们使用语法 @ 然后,对于类型应用程序,您可以将一个类型“应用”到该应用程序并获取一个新类型。

    let foo = Right 1 :: forall a. Either a Int
    foo @Char   :: Either Char Int
    foo @Double :: Either Double Int
    
    推荐文章
    alphacentauri  ·  HOMap实现示例
    10 年前