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

求解R.Bird函数编程练习:符合(num->num)->num类型的Haskell函数

解决Haskell中(num -> num) -> num类型函数的实现问题

嘿,我明白你卡在哪了!你写的func1 f = f 3之所以类型不符合预期,是因为Haskell的类型推断会默认让函数尽可能通用——它推断出的Num t1 => (t1 -> t2) -> t2意味着f可以返回任意类型,而不仅仅是Num类型。要得到你想要的(num -> num) -> num(也就是基于Num类型类的(t -> t) -> t,其中t属于Num),只需要给函数加上显式的类型签名来约束类型范围就行。

正确的实现方式

给func1加上明确的类型签名,强制f的输入和输出都是同一Num类型,最终返回该类型的值:

func1 :: Num t => (t -> t) -> t
func1 f = f 3

测试验证

用你写的square函数测试看看:

square :: Num t => t -> t
square x = x * x

-- 调用后类型为 Num t => t,完全符合 (num -> num) -> num 的要求
testResult = func1 square

你还可以指定具体类型获取对应结果:

  • func1 square :: Int 会返回 9
  • func1 square :: Double 会返回 9.0

为什么之前的实现不行?

没有类型签名时,Haskell允许f返回非Num类型(比如f可以是show :: Int -> String,此时func1 show会返回"3")。加上类型签名后,我们就严格约束了:

  • f必须接受一个Num类型的参数
  • f必须返回同一个Num类型的值
  • 最终func1的返回值就是这个Num类型的值

这样就完全匹配你需要的(num -> num) -> num类型了!

内容的提问来源于stack exchange,提问作者samlu1999

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:03:40