当前位置: 首页 > 知识库问答 >
问题:

为什么这个函数不能typecheck?

唐焕
2023-03-14
f :: Bool -> Int -> (a -> Int) -> Int
f x y z = if x then y + y else (z x) + (z y)

预计此函数将无法typeCheck。然而,没有解释发生这种情况的原因。在GHCI中试用时,我得到了以下输出:

Prelude> :l test [1 of 1] Compiling Main             ( test.hs,
interpreted )

test.hs:2:35:
    Couldn't match expected type `a' with actual type `Bool'
      `a' is a rigid type variable bound by
          the type signature for f :: Bool -> Int -> (a -> Int) -> Int
          at test.hs:1:6
    Relevant bindings include
      z :: a -> Int (bound at test.hs:2:7)
      f :: Bool -> Int -> (a -> Int) -> Int (bound at test.hs:2:1)
    In the first argument of `z', namely `x'
    In the first argument of `(+)', namely `(z x)' Failed, modules loaded: none.

为什么会出现这种情况?

共有1个答案

令狐嘉禧
2023-03-14
f :: Bool -> Int -> (a -> Int) -> Int
f x y z = if x then y + y else (z x) + (z y)

类型签名断言我们的函数z在其第一个参数中是多态的。它接受任意类型的值a并返回int。但是,类型变量A的作用域也意味着它在所有使用中都必须是相同的类型A不能在同一使用站点实例化为不同的类型。这是“1级息肉”。

您可以将该类型读为:

f :: forall a. Bool -> Int -> (a -> Int) -> Int

所以:

z (x :: Bool) + z (y :: Int)
Prelude> :set -XRankNTypes

Prelude> let f :: Bool -> Int -> (forall a . a -> Int) -> Int 
             f x y z = if x then y + y else (z x) + (z y)
Prelude> f True 7 (const 1)
14
 类似资料:
  • 奇怪的是,标记为“OK”的行编译得很好,但标记为“Error”的行失败了。它们看起来基本上是一样的。

  • 问题内容: 码: 上面的代码不起作用。当我单击#clicker时,它不会发出警报,也不会隐藏。我检查了控制台,没有任何错误。我还检查了JQuery是否正在加载,实际上是否正在加载。所以不确定是什么问题。我还执行了带有警报的文档就绪功能,并且该功能正常工作,因此不确定我在做什么错。请帮忙。谢谢! 问题答案: 您应该在一个块中添加javascript代码。 即 正如jQuery文档指出的那样:“在文档

  • 使用scandir()函数时,我收到以下php警告: Scandir无法打开目录:公共html/page2中不允许操作。php在线3 第2页。php 我想使用这个功能来打印我的根文件夹的文件和子目录,但它不工作。 有人知道怎么修吗?

  • chrome浏览器 onclick链接 O:https://www.w3schools.com窗口打开 X:about:空白窗口打开

  • 问题内容: 我用 和做了一些测试 。他们似乎都慢于。是因为精度更高吗?计算斜边函数的方法是什么?令人惊讶的是,我在文档中找不到任何表明性能不佳的迹象。 问题答案: 这不是一个简单的sqrt函数。您应该检查此链接以实现算法:http : //www.koders.com/c/fid7D3C8841ADC384A5F8DE0D081C88331E3909BF3A.aspx 它具有while循环以检查收

  • 然而,Antlr似乎不喜欢我在两个不同的地方使用“函数”。据我所知,语法甚至没有歧义。 在下面的语法中,如果我删除第1行,生成的解析器解析示例输入没有问题。另外,如果我更改第2行或第3行中的令牌字符串,使它们不相等,解析器就会工作。 我得到的语法错误是: 测试生成的解析器的程序: