【发布时间】:2012-07-17 22:07:14
【问题描述】:
可能重复:
Why is such a function definition not allowed in haskell?
我创建了一个名为funlist 的haskell 函数。它的作用是接受一个起始值和一个函数列表,并将列表中的所有函数应用于起始值。
funlist thing [function] = function thing
funlist thing (function:functions) = funlist (function thing) functions
funlist _ _ = error "need a list of functions"
这个函数的问题是它的类型是funlist :: t -> [t -> t] -> t。该类型意味着虽然 ghc 将允许不将起始值转换为完全不同类型的函数列表(例如 [sin,cos,tan] 将被允许),但将起始值转换为不同类型的函数(例如 @987654326 @) 将产生错误,因为该函数与类型签名不匹配。
这不是函数应该如何工作的。它应该能够获取更改起始值类型的函数列表(例如[sin,show])。这个函数基本上是把funlist 5 [sin,cos,tan,isInfinite,show]转换成show $ isInfinite $ tan $ cos $ sin $ 5,虽然后者有效,但前者无效。
有什么方法可以让这个功能正常工作吗?
编辑:我知道. 和>>>,我只是想知道是否有办法使这项工作发挥作用。
【问题讨论】:
-
如果你用
funlist :: a -> [a->b] -> b?帮助类型系统是否有效 -
为什么不构建一个函数并像在列表中使用 (:) 一样使用 (.) 而不是构建函数列表?如果您需要其他信息,例如已经堆叠了多少函数,我建议为此使用 state monad。
-
…如果你用 'a -> [a->b] -> b' 帮助类型系统,你不能链接函数。
-
@sdcvvc :它们非常相似,但询问的是参数列表而不是函数列表。在抽象层面上,它们相似,但答案不同。
-
@GeorgeStocker 是这里真正需要的版主干预,如果是这样,为什么不由至少在其 507 个标签中显示“haskell”标签的人进行干预?
标签: haskell