gpt4 book ai didi

Haskell:为什么没有类型不匹配(为什么会编译)?

转载 作者:行者123 更新时间:2023-12-04 01:45:10 25 4
gpt4 key购买 nike

我太困了,我写了以下代码(修改以显示困惑):

fac s = take 10 [s, s `mod` 1 ..]

maxFactor x = if (s == [])
then x
else head <-- this should be 'head x' instead of just 'head'
where s = fac x

但是,这个加载到 ghci(和编译)中就好了。当我执行 maxFactor 1 ,它提示(当然):
<interactive>:0:1:
No instance for (Integral ([a0] -> a0))
arising from a use of `maxFactor'
Possible fix:
add an instance declaration for (Integral ([a0] -> a0))
In the expression: maxFactor 1
In an equation for `it': it = maxFactor 1

<interactive>:0:11:
No instance for (Num ([a0] -> a0))
arising from the literal `1'
Possible fix: add an instance declaration for (Num ([a0] -> a0))
In the first argument of `maxFactor', namely `1'
In the expression: maxFactor 1
In an equation for `it': it = maxFactor 1

但是,我不明白这种行为:
fac的类型是:
fac :: Integral a => a -> [a]

maxFactor的类型是:
maxFactor :: Integral ([a] -> a) => ([a] -> a) -> [a] -> a

这是否意味着以下内容:
  • fac 的第一个输入必须是类型类 Integral (例如,fac 10);
  • 因为在 maxFactor 的定义中,有fac x , x 也必须是类型类 Integral ,因此,maxFactor的类型将以 maxFactor :: (Integral a) => a -> 之类的开头……然后还有别的吗?但是,如果是这种情况,那么为什么在返回 maxFactor 之后这段代码会编译?可以是xhead ,当遵循这条推理时,不具有相同的类型?

  • 我在这里想念什么?

    感谢您提前提供任何输入!

    最佳答案

    正如您正确注意到的那样,函数 fac 的使用maxFactor 内部添加 Integral ax 类型的约束.所以x需要是 Integral a => a 类型.

    此外,编译器看到 maxFactor要么返回 head ,其类型为 [a]->ax .因此x必须具有更具体的类型 Integral ([a]->a) => ([a]->a) ,等等maxFactor有类型

    maxFactor :: Integral ([a] -> a) => ([a] -> a) -> ([a] -> a)

    这正是你得到的。到目前为止,这个定义没有任何“错误”。如果您设法编写了 Integral 的实例类型 ([a]->a)你可以调用 maxFactor没有问题。 (显然 maxFactor 不会按预期工作。)

    关于Haskell:为什么没有类型不匹配(为什么会编译)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10091874/

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