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
Function 如何声明';操作员';需要2个参数,并且使用字母而不是符号?_Function_Haskell - Fatal编程技术网

Function 如何声明';操作员';需要2个参数,并且使用字母而不是符号?

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

我希望能够使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

<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
只是其中一个参数的本地名称。