Haskell如何定义无参数函数?
如何定义一个不接收任何参数的函数?
在Haskell里,“不接收任何参数的函数”有两种常见实现方式,针对你遇到的问题逐一说明:
错误原因解释
你注释掉的代码之所以报错,是因为Address "NYC" "<TBD>"已经是一个完整的Address类型值,但你给函数声明的类型是() -> Address——这是一个需要接收()参数才能返回Address的函数类型,类型不匹配自然会触发错误。
两种正确实现方式
1. 常量值(最常用的“无参数”形式)
这就是你当前写的代码,在Haskell里这是最符合“无参数函数”语义的实现:
data Address = Address { city :: String, street :: String } deriving ( Show ) mkIncompleteAddress :: Address mkIncompleteAddress = Address "NYC" "<TBD>"
调用时直接写mkIncompleteAddress即可,不需要加任何参数——它本质就是一个固定的、不需要输入就能确定的值,和其他语言里的全局常量/无参函数效果一致。
2. 显式接收()参数的函数
如果一定要写成“接收无意义参数”的函数形式(比如某些高阶函数要求传入() -> a类型的参数),可以这样写:
- 方式一:显式匹配
()参数
mkIncompleteAddress :: () -> Address mkIncompleteAddress () = Address "NYC" "<TBD>"
调用时需要传入(),比如mkIncompleteAddress ()。
- 方式二:用
const函数简化
mkIncompleteAddress :: () -> Address mkIncompleteAddress = const $ Address "NYC" "<TBD>"
const函数的作用是忽略输入的参数,直接返回后面的固定值,刚好满足() -> Address的类型要求。
补充说明
Haskell是纯函数式语言,所有函数都是柯里化的。所谓“无参数函数”在语义上其实就是一个常量值——因为它不需要任何输入就能确定结果。只有在特定场景下(比如需要适配函数类型接口),才需要显式用()作为参数来定义函数。
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

