Function 如何声明';操作员';需要2个参数,并且使用字母而不是符号?
我希望能够使VB(.net)中的运算符如下所示Function 如何声明';操作员';需要2个参数,并且使用字母而不是符号?,function,haskell,Function,Haskell,我希望能够使VB(.net)中的运算符如下所示 Console.WriteLine ( 16 Mod 2 ) 0 生成如下所示的输出 Console.WriteLine ( 16 Mod 2 ) 0 如您所见,这使代码更易于阅读。我将如何制作实现这一点的函数 我尝试了以下格式 equal :: Integer -> Integer -> bool x `equal` y = x == y 我得到以下错误 *Main> 5 equal 5 <interacti
Console.WriteLine ( 16 Mod 2 )
0
生成如下所示的输出
Console.WriteLine ( 16 Mod 2 )
0
如您所见,这使代码更易于阅读。我将如何制作实现这一点的函数 我尝试了以下格式
equal :: Integer -> Integer -> bool
x `equal` y = x == y
我得到以下错误
*Main> 5 equal 5
<interactive>:1:1: error:
* Non type-variable argument
in the constraint: Num ((Integer -> Integer -> Bool) -> t -> t1)
(Use FlexibleContexts to permit this)
* When checking the inferred type
it :: forall t t1.
(Num ((Integer -> Integer -> Bool) -> t -> t1), Num t) =>
t1
*Main>
*Main>5等于5
:1:1:错误:
*非类型变量参数
在约束中:Num((Integer->Integer->Bool)->t->t1)
(使用FlexibleContext允许此操作)
*检查推断类型时
it::对于所有t t1。
(Num((Integer->Integer->Bool)->t->t1),Num t=>
t1
*Main>
哪里出了问题?我如何正确地执行它?调用它时,需要在
equal
周围使用反勾号,就像定义它时一样
5 `equal` 5
按照您编写它的方式,Haskell认为您正在尝试将
equal
作为参数传递给5
,而不是相反的方式。调用它时,您需要在equal
周围使用反勾号,就像您定义它时一样
5 `equal` 5
你写它的方式,Haskell认为你是想把
equal
作为一个参数传递给5
,而不是反过来。这是有效的。谢谢顺便问一下,为什么在定义时需要使用反勾号。如果我在定义时不使用它们,我会得到一个编译错误,说该函数缺少附带的绑定。我通过查看Data.Boolean包中xor的定义发现反勾号是实现这一点的方法,但我不知道为什么需要它们。@Jamesyeman所有具有非符号名称的Haskell函数都是普通前缀函数,不是中缀运算符。您可以通过使用括号(如(+)
)将中缀运算符转换为前缀函数,同样,您也可以通过使用倒勾(如`elem`
)将前缀函数转换为中缀运算符。谢谢。在我们真正开始学习计算机科学之前,我正在自学Haskell。这是我的第一个函数式编程语言。Brain.exe没有响应…@JamesYeoman,如果您编写的x=y=…
在编译器看来与func a b=…
完全相同。它不可能知道在第一种情况下,第二个名称是您正在定义的函数(另外两个是其参数的本地名称),而在另一种情况下,第一个名称是函数。因此Haskell采用了一个非常简单的语法规则:字母数字名称始终是前缀函数,符号名称始终是中缀运算符。这意味着x等于y=…
正在定义一个函数x
equals
只是它的一个参数的本地名称。这很有效。谢谢顺便问一下,为什么在定义时需要使用反勾号。如果我在定义时不使用它们,我会得到一个编译错误,说该函数缺少附带的绑定。我通过查看Data.Boolean包中xor的定义发现反勾号是实现这一点的方法,但我不知道为什么需要它们。@Jamesyeman所有具有非符号名称的Haskell函数都是普通前缀函数,不是中缀运算符。您可以通过使用括号(如(+)
)将中缀运算符转换为前缀函数,同样,您也可以通过使用倒勾(如`elem`
)将前缀函数转换为中缀运算符。谢谢。在我们真正开始学习计算机科学之前,我正在自学Haskell。这是我的第一个函数式编程语言。Brain.exe没有响应…@JamesYeoman,如果您编写的x=y=…
在编译器看来与func a b=…
完全相同。它不可能知道在第一种情况下,第二个名称是您正在定义的函数(另外两个是其参数的本地名称),而在另一种情况下,第一个名称是函数。因此Haskell采用了一个非常简单的语法规则:字母数字名称始终是前缀函数,符号名称始终是中缀运算符。这意味着x等于y=…
正在定义一个函数x
equals
只是其中一个参数的本地名称。