求解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会返回9func1 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
相关产品推荐
相关产品推荐

