haskell - 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 只允许对固定数量的参数进行模式匹配?如果是这样,有人可以解释为什么做出这个决定吗?
解决方案
您应该在函数定义的所有子句中指定相同数量的参数。因此,这意味着您将其实现为:
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)
推荐阅读
- ssl - SSL/TLS 证书管理(密钥、crt 和 pem)
- kubernetes - 抱怨“extensions/v1beta1 Ingress 已弃用”的日志
- delphi - Azure 存储表访问
- c - 在 C 中使用宏而不是函数有什么好处?
- python - 如何从熊猫数据框中按变量删除第一年的数据?
- stripe-payments - 跨多个域使用 Stripe api 密钥
- swift - 使用 Parse 可以存储多少数据?
- server - 哪种 Raspberry Pi 最适合托管这些 Discord 机器人?
- awk - 比较两个文件并打印同一行的程序
- typescript - npm 自定义打字稿包 - 类型显示为任何