Haskell类型和签名
我在准备关于哈斯克尔的考试。我不明白如何确定函数的类型。功能是:Haskell类型和签名,haskell,types,functional-programming,integer,Haskell,Types,Functional Programming,Integer,我在准备关于哈斯克尔的考试。我不明白如何确定函数的类型。功能是: 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)是一个元组。那(函数t f)呢,是a还是?我如何将这两条线混合在一起 func [] f = 16 此行定义函数func,接
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)
是一个元组。那(函数t f)
呢,是a
还是?我如何将这两条线混合在一起
func [] f = 16
此行定义函数func
,接受列表和f
,并返回16
。类型可以写成numa=>[b]->c->a
func (h : t) f = (f h) + (func t f)
此行将f
类型限制为Num a=>b->a
,因为:
f
应接受列表中的元素f…
应返回一个值,该值可添加到func…
func
的类型是:
Num a => [b] -> (b -> a) -> a
找出此类问题的一个(简单)方法是将其写入文件并加载到ghci
中,然后发出命令:t func
,这在准备考试时很好,但在考试期间不适用-因此我将带您了解可以找到的提示
因为@soon给出了一个完全正确的答案——我只想补充一些你将来可能会用到的提示:
确定参数的数量(如果函数以无点风格编写,这可能有点困难,即func x=const x
可以写成func=const
)
在这种情况下,我们得到两个参数和一个结果,这样我们就可以把签名写成
func :: ? -> ? -> ?
16
)并确定其类型
您已经注意到,16
是一种数字形式,因此
func :: Num a => ? -> ? -> a
看来这是一个很好的起点类型的类型构造函数
现在在第一种和第二种情况下,我们有两个提示,第一个参数的类型是list([]
,构造函数(:)
)给我们提供了这个信息。因为我们没有关于列表内容的信息,我们必须为它们分配一个不同的类型变量-b
func :: Num a => [b] -> ? -> a
(+)
操作符,(f h)
-因为haskell中的空格字符意味着我们得到的函数应用程序h
的类型必须是函数f
的域,并且作为f h
的结果与(+)::Num a=>a->a->a->a
(请注意,两个参数必须具有相同的类型以及结果)和func t f
(即a
)的结果我们得到了f
的目标类型,因此f::b->a
func :: Num a => [b] -> (type-of-f) -> a
func :: Num a => [b] -> (b -> a) -> a
@很快,感谢您的编辑,这样更容易阅读欢迎您!好的,谢谢您,因此在(f h)中,haskell使用参数h调用f,然后将结果添加到
code
((func t f))?是否正确?我可以为另一个函数执行此操作,func2 1(h:t)=h;func2 n(h:t)=func2(n-1)t
func2::Num a=>a->[b]->b
因为1是一个数字类型,(h:t)是一个列表,h是列表的第一个元素。第二行是func2::Num a=>a->[b]>?
可能是第一行的结果,它是b?所以完整的东西是func2::Num a=>a->[b]->b
。这是正确的吗?似乎非常正确,除了基本情况“1”意味着(Eq a)
的一个实例之外。似乎,我认为这是因为你可以在if(n==1)中翻译这个表达式…然后…else
expressionbtw-您可以在文件中键入func2
定义-使用ghci myfile.hs将其加载到ghci中,然后:t func2
以查看您的推理是否正确