繁体   English   中英

Haskell类型和签名

[英]Haskell types and signatures

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

func [] f = 16
func (h : t) f = (f h) + (func t f)

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

func [] f = 16

该行定义了一个函数func ,接受一个列表和f ,并返回16 该类型可写为Num a => [b] -> c -> a

func (h : t) f = (f h) + (func t f)

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

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

所以, func的类型是:

Num a => [b] -> (b -> a) -> a

找出这些问题的一种(简单)方法是将其写入文件并将其加载到ghci并发出命令:t func ,这在准备考试时很好但在它期间不适用 - 所以我会走你通过可以找到的提示。

由于@soon提供了一个非常有效的答案 - 我只会添加一些您将来可能会使用的提示:

确定参数的数量(如果函数是以无点样式编写的,这可能有点困难,即func x = const x可以写为func = const

所以在这种情况下,我们得到两个参数和一个结果,所以我们可以将签名写为

func :: ? -> ? -> ?
  1. 寻找结果(在这种情况下为16 )并确定它的类型你已经注意到16是数字的东西 - 因此

     func :: Num a => ? -> ? -> a 

    看起来是一个很好的起点。

  2. 查找可帮助您识别函数中的ADT或type / newtype的类型构造函数。

    现在在第一和第二种情况下,我们有两个提示,第一个参数是类型列表( []和构造函数(:) )给我们这个信息。 由于我们没有关于列表内容的信息,我们必须为它们分配不同的类型变量 - b

     func :: Num a => [b] -> ? -> a 
  3. 识别用于确定其余部分的函数,或者为已经找到的东西获取更专业的类型

    这里我们有2个信息,一个是(+)运算符,和(fh) - 因为haskell中的空白字符表示函数应用,我们得到h的类型必须是函数f的域,并且因为使用了fh的结果with (+) :: Num a => a -> a -> a (注意两个参数必须具有相同的类型,以及结果)和func tf的结果(这是a )我们得到目标类型f ,因此f :: b -> a

我们得到了这个

func :: Num a => [b] -> (type-of-f) -> a
func :: Num a => [b] -> (b -> a) -> a

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM