如何基于类型签名定义符合要求的Haskell函数
Haskell函数定义修正方案
正确实现
f :: (m -> n -> l) -> (m -> n) -> m -> l f g h x = g x (h x)
原写法错误原因
- 存在无终止条件的递归调用:右侧再次调用
f本身,运行时会陷入无限循环 - 参数数量不匹配:
f需要接收3个参数,你在右侧调用时仅传入2个参数,与类型签名要求完全不符
实现逻辑推导
从给出的类型签名可以直接推导出实现逻辑:
- 第一个入参
g是二元函数,需要接收m、n两个类型的值才能返回目标类型l的结果 - 第二个入参
h是一元函数,可以将m类型的值转换为n类型 - 第三个入参
x是m类型的值,刚好可以直接作为g的第一个参数,将h x的计算结果作为g的第二个参数,即可得到符合类型要求的返回值
内容的提问来源于stack exchange,提问作者Andrea Berger
相关产品推荐
相关产品推荐

