【问题标题】:Haskell type dessignationHaskell 类型指定
【发布时间】:2012-05-15 11:31:06
【问题描述】:

我必须指定 2 个函数的类型(不使用编译器:t)我只是不知道我是如何阅读这些函数以做出正确的步骤的。

f x = map -1 x
f x = map (-1) x

好吧,我有点困惑如何解析它

【问题讨论】:

  • map -1 x 被解析为(map) - (1 x)。但它的类型不是很好。
  • 这是否意味着我们想从地图中减去一些东西?
  • 基本上。这将对函数类型施加一些疯狂的限制(我认为是Num (t -> (a -> b) -> [a] -> [b]))。

标签: haskell types type-conversion


【解决方案1】:

函数应用,或“空格运算符”的优先级高于任何运算符符号,因此第一行解析为f x = map - (1 x),这很可能是1类型错误。

另一个例子用括号括起来,但请注意(-1) 脱糖为negate 1。这是正常规则的一个例外,其中像 (+1) 这样的操作符部分 desugar 为 (\x -> x + 1),所以这也可能是一个类型错误,因为 map 需要一个函数,而不是一个数字, 作为它的第一个参数。

1 我说可能,因为从技术上讲,为可能允许类型检查的函数提供Num 实例是可行的。

【讨论】:

  • 它为我输入检查,但结果很丑。
【解决方案2】:

对于此类问题,确定的答案是查看Haskell Report。相关语法与 Haskell 98 相比没有变化。

请特别检查“表达式”部分。这应该可以解释表达式是如何解析的、运算符优先级等。

【讨论】:

    【解决方案3】:

    这些函数没有类型,因为它们没有类型检查(你会得到可笑的类型类约束)。要弄清楚原因,您需要知道(-1) 的类型为Num n => n,并且您需要阅读- 前面带或不带括号的解释方式。

    以下函数是您的函数的“正确”版本:

    f x = map (subtract 1) x
    

    如果我这么说,你应该能够弄清楚这个函数的类型:

    subtract 1 :: Num n => n -> n
    map :: (a -> b) -> [a] -> [b]
    

    【讨论】:

      【解决方案4】:

      我自己做的:P

      (map) - (1 x)
      (-)::Num a => a->a->->a
      1::Num b=> b
      x::e
      map::(c->d)->[c]->[d]
      map::a
      a\(c->d)->[c]->[d]
      (1 x)::a
      1::e->a
      f::(Num ((c->d)->[c]->[d]),Num (e->(c->d)->[c]->[d])) => e->(c->d)->[c]->[d]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多