Haskell类型和签名

Ask*_*ker 2 haskell types integer functional-programming

我正在学习关于Haskell的考试.我不明白我如何确定函数的类型.功能是:

func [] f = 16
func (h : t) f = (f h) + (func t f)
Run Code Online (Sandbox Code Playgroud)

我的猜测是第一行有这种类型:empty list -> a -> awhere a必须是数字类型.在Haskell表示法中Num a => [] -> a -> a,第二行有这种类型:[a]-> a -> ?它返回什么?也许(a, a)因为 (f h)是一个元组.怎么样(func t f),是a或?我如何将两条线混合在一起?

awe*_*oon 6

func [] f = 16
Run Code Online (Sandbox Code Playgroud)

这一行定义了一个函数func,接受一个列表f,然后返回16.类型可以写成Num a => [b] -> c -> a.

func (h : t) f = (f h) + (func t f)
Run Code Online (Sandbox Code Playgroud)

此行将f类型限制为Num a => b -> a,因为:

  1. f 应接受列表中的元素
  2. f ... 应该返回一个值,该值可以添加到结果中 func ...

所以,类型func是:

Num a => [b] -> (b -> a) -> a
Run Code Online (Sandbox Code Playgroud)