【问题标题】:Haskell - Pass a function and its arguments as separate argumentsHaskell - 将函数及其参数作为单独的参数传递
【发布时间】:2015-06-27 16:09:36
【问题描述】:

我想分别传递一个函数及其参数

现在我有了一个函数,我们称之为 myfunc,它接受一个参数。

我有另一个函数 (func2),它接受多个参数,其中最后两个是函数 (f) 及其参数 (a)。我无法将它们一起传递,因为我需要它们分开。

(...表示其他参数)

我已经做到了(场景 I):

func2 ... myfunc args

但是当我尝试做(将 SCENARIO I 作为 2 个最后一个参数传递给 main func2)时:

func2 ... func2 (... myfunc args)

我得到一个错误。我相信 myfunc 正在评估,第二个 func2 缺少参数。做什么?

【问题讨论】:

  • 我很难理解这一点——你能进一步详细说明你的例子吗?也许在最后一种情况下,您只是想传递一个元组 (myfunc, args) 而不是应用程序 myfunc args
  • func2的类型是什么?
  • @duplode: Int -> (a -> a) -> a -> a
  • ...然后你想将func2作为a -> a类型的参数传递,场景#1的结果作为a类型的参数?
  • 是的@duplode,但我相信我无法评估场景的结果,似乎 a 实际上是一个参数,而不是三个(因为 ... 是一个参数)

标签: function haskell arguments


【解决方案1】:

当您遇到类型错误时,首先要做的是检查所有涉及的表达式的类型。你的func2 有类型

func2 :: Int -> (a -> a) -> a -> a

所以场景 #1 中的完整表达式类似于

func2 n myfunc args

n :: IntmyFunc :: a -> aargs :: 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 应用于myfuncargs,这将不起作用,因为nInt,甚至不是函数。您只想传递场景#1 的完整表达式,它具有预期的a 类型。所以场景 #2 可能是:

func2 m (func2 m myfunc) (func2 n myfunc args)

这至少可以通过类型检查器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多