Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell类型和签名_Haskell_Types_Functional Programming_Integer - Fatal编程技术网

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
    
    看来这是一个很好的起点

  • 查找有助于识别函数中ADT或
    类型的类型构造函数

    现在在第一种和第二种情况下,我们有两个提示,第一个参数的类型是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
    以查看您的推理是否正确