Function 如何检查Haskell项目中函数调用的参数是否过多或过少

Function 如何检查Haskell项目中函数调用的参数是否过多或过少,function,haskell,error-handling,Function,Haskell,Error Handling,我在Haskell项目上工作, 对于错误检查,我需要处理任何参数过多或过少的函数调用,但我目前对此一无所知。希望得到相同的提示来启动。除非有人使用某种形式的高级即席多态性,就像编译器会注意到的那样 事实上,如果您有如下函数: add :: Int -> Int -> Int add = (+) 如果您使用三个参数调用它,比如add245,那么这将引发一个错误。这将发生,因为add 2 4 5或更规范的add 2 4 5最终将尝试调用一个Int类型的项。实际上,add 2的类型为ad

我在Haskell项目上工作,
对于错误检查,我需要处理任何参数过多或过少的函数调用,但我目前对此一无所知。希望得到相同的提示来启动。

除非有人使用某种形式的高级即席多态性,就像编译器会注意到的那样

事实上,如果您有如下函数:

add :: Int -> Int -> Int
add = (+)
如果您使用三个参数调用它,比如add245,那么这将引发一个错误。这将发生,因为add 2 4 5或更规范的add 2 4 5最终将尝试调用一个Int类型的项。实际上,add 2的类型为add 2::Int->Int,因此add 2 4的类型为add 2 4::Int,因此,由于这不是函数,编译器将引发错误:

Prelude> add 2 4 5
<interactive>:5:1: error:
    • Couldn't match expected type ‘Integer -> t’
                  with actual type ‘Int’
    • The function ‘add’ is applied to three arguments,
      but its type ‘Int -> Int -> Int’ has only two
      In the expression: add 2 4 5
      In an equation for ‘it’: it = add 2 4 5
    • Relevant bindings include it :: t (bound at <interactive>:5:1)
它是一个需要以下参数的函数。这可能会与另一个需要Int的函数发生冲突,但随后会出现类似的异常,但需要的是非函数Int,例如,实际类型是函数,因此类似于:

    • Couldn't match expected type ‘Int’
                  with actual type ‘Integer -> t’
因此,如果调用参数太多的函数,或者使用参数太少的函数的结果,Haskell的类型系统就会出错

请注意,严格来说,在Haskell中,每个函数只接受一个参数。如果不提供函数,则结果仍然是函数,如果提供函数,则进行函数调用,但该函数可以生成另一个函数,因此需要下一个参数


printf可以接受一个、两个或多个参数的原因是。这可以是一个IO a,它将打印格式化字符串的结果,也可以是一个函数PrintfArg a,PrintfType r=>a->r,它将接受PrintfArg类型的参数,并返回另一个PrintfType类型。因此,如果需要另一个函数,它每次都可以专门处理一个额外的函数。但是这就模拟了一个可变函数,在这个函数中可以传递任意数量的参数。

Haskell有一个静态类型系统,这意味着如果用太少或太多的参数调用函数,那么它将引发编译器错误。此外,请注意,严格地说,在Haskell中,每个函数只有一个参数。这是否可能捕获编译器错误,然后执行其他操作?只是不要让程序终止。但为什么?对Int执行函数调用是没有意义的,例如,这没有任何意义。这意味着有人写了一些非感官的东西。Haskell旨在提供一个类型系统,该系统通常试图消除代码中的大多数技术错误。因此,除了例如一个算法/概念错误,它的目的是确保你不会在第一时间得到很多错误。
    • Couldn't match expected type ‘Int’
                  with actual type ‘Integer -> t’