You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:20:57