Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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
Function (a->;a)和a->;之间的差异;A._Function_Haskell_Syntax_Definition_Function Declaration - Fatal编程技术网

Function (a->;a)和a->;之间的差异;A.

Function (a->;a)和a->;之间的差异;A.,function,haskell,syntax,definition,function-declaration,Function,Haskell,Syntax,Definition,Function Declaration,我注意到(虽然有一次我被告知(a->a)和a->a的意思是一样的),但当我使用(a->a)时,我会收到错误消息。当在类型中使用括号时,我应该只使用(a->a)?(即(5+3)而不是5+3)?只是不太确定什么时候需要(a->a)和a->a是一样的 但与更多类型组合时会有所不同,如: a -> a -> b (a -> a) -> b 这是因为->是右关联的,所以a->a->b实际上意味着a->(a->b)(获取a并返回一个函数),这与(a->a->b(获取一个函数并返

我注意到(虽然有一次我被告知
(a->a)
a->a
的意思是一样的),但当我使用
(a->a)
时,我会收到错误消息。当在类型中使用括号时,我应该只使用
(a->a)
?(即
(5+3)
而不是
5+3
)?只是不太确定什么时候需要

(a->a)
a->a
是一样的

但与更多类型组合时会有所不同,如:

 a -> a  -> b
(a -> a) -> b
这是因为
->
是右关联的,所以
a->a->b
实际上意味着
a->(a->b)
(获取
a
并返回一个函数),这与
(a->a->b
(获取一个函数并返回一个
b
)不同


这就像
(1+2)*3
不同于
1+2*3

当编译器可用的其他信息没有帮助时,括号可以消除Haskell中的几个结构的歧义:

应用程序在左边

所以你可以省略函数参数的参数

涉及中缀运算符的表达式通过运算符的固定性消除歧义

因此,在许多情况下,不需要使用具有不同固定性的二元运算符的parens

具有相同优先级的连续无关联运算符必须同时为左关联或右关联,以避免语法错误

最后:

给定一个未加括号的表达式
x op y op z
,必须在
x op y
y op z
的周围添加括号,除非有关前向性的某些条件成立


我的一般建议是,如果上面的陈述没有任何意义:在你学会规则之前,把事情加上括号。或者,努力学习。

他们是一样的。您能描述一下使用
(a->a)
时出现的错误吗?使用ghci-7.0.3对我来说效果很好:

Prelude> let f :: (a -> a); f = id
Prelude> f "foo"
"foo"
Prelude>

通常,在使用函数作为参数时,需要在类型中使用括号。例如,
map::(a->b)->[a]->[b]
。如果没有帕伦函数,它将意味着其他东西。

这只会在生成高阶函数时产生影响。例如:

f :: a -> a -> b
是一个函数,它需要两个
a
类型的参数,并返回
b
类型的值,如下所示

f 2 2
f True True
但是功能

f :: (a -> a) -> b
需要一个函数作为参数。如果
a->a
(a->a)
是类型推断中的唯一参数,则它们唯一的时间相同,如下所示

f :: (a -> a)
-- Same type as
f :: a -> a

键入时
()
的规则与普通表达式中的规则几乎相同。这就像一个级别以上的表达式。

考虑表达式
10/2/5
。这与
(10/2)/5
10/(2/5)
相同吗?如果将
/
解释为数学除法,则前者为真,而后者为假。你看,你的问题的答案是“有区别,但只是有时候”

类型则相反<代码>a->b->c与
a->(b->c)
相同,但绝对不同于
(a->b)->c

你说你不太确定什么时候有必要:嗯,就在这里。如果函数的参数也是一个函数,那么它是必要的

考虑
map::(a->b)->[a]->[b]
。这与
a->b->[a]->[b]
不同,您可以看到,
(a->b)
表示一种特定类型的函数:从类型
a
到类型
b
的函数

iterate::(a->a)->a->[a]
更有趣。此函数要求第一个参数中函数的输入和输出类型必须相同


你可能对咖喱和部分申请感兴趣。许多资源中有一个很好的资源:

你能分享错误吗?这也是一种混淆,因为你给出的标题看起来像是类型中
->
的关联,而你的示例是表达式(例如
5+3
)。
f :: (a -> a)
-- Same type as
f :: a -> a