我想分别传递函数及其参数
现在我有了一个函数,让我们调用它myfunc,它只需要一个参数。
我有另一个函数(func2),它接受多个参数,其中最后两个是函数(f)及其参数(a)。我不能把它们分开,因为我需要它们分开。
(...表示其他参数)
我成功了(情景一):
func2 ... myfunc args
但是当我尝试做的时候(将SCENARIO I作为主要func2的最后两个参数传递):
func2 ... func2 (... myfunc args)
我收到错误。我相信myfunc正在评估,第二个func2正在丢失参数。怎么办?
答案 0 :(得分:3)
当你遇到类型错误时,首先要做的是检查所有涉及的表达式的类型。您的func2
有类型
func2 :: Int -> (a -> a) -> a -> a
因此情景#1中的完整表达式将类似于
func2 n myfunc args
对于某些n :: Int
, myFunc :: a -> a
,args :: a
和a
。那么你想做一些m :: Int
func2 m func2 (n myfunc args)
但类型不匹配。 func2
不是a -> a
函数;你需要提供前两个参数来获得一个(顺便说一句,你也可以将func2
的类型读作Int -> (a -> a) -> (a -> a)
- 两个参数的函数导致a -> a
函数)。至于最后一个论点,n myfunc args
意味着将n
应用于myfunc
和args
,这将不起作用n
是Int
,甚至不是一个功能。您只想传递场景#1的完整表达式,它具有预期的a
类型。所以场景#2可能是:
func2 m (func2 m myfunc) (func2 n myfunc args)
这至少会超过类型检查器。