首页 > 解决方案 > Haskell中的模式匹配和arity

问题描述

在尝试定义与重复评估相对应的 Haskell 函数时,我遇到了“Equations give different arities”错误。这是我的代码:

nEvals :: Int -> (a -> a) -> a -> a
nEvals 1   = ($) --equivalent to nEvals 1 f x = f x
nEvals k f = (nEvals (k - 1) f) . f --equivalent to nEvals k f x = nEvals (k - 1) f (f x)

我不太明白为什么 Haskell 会给出这个错误,因为我使用的是模式匹配,而不是明确地为给定的一组输入分配一个值。也许 Haskell 只允许对固定数量的参数进行模式匹配?如果是这样,有人可以解释为什么做出这个决定吗?

标签: haskell

解决方案


您应该在函数定义的所有子句中指定相同数量的参数。因此,这意味着您将其实现为:

nEvals :: Int -> (a -> a) -> a -> a
nEvals 1 f = f  -- added f as parameter
nEvals k f = (nEvals (k - 1) f) . f

我们还可以通过以下方式减少参数数量:

nEvals :: Int -> (a -> a) -> a -> a
nEvals 1 = id
nEvals k = (.) =<< nEvals (k - 1)

推荐阅读