为接受多个参数的函数进行显式类型定义时,输入“::”的解析错误

parse error on input ‘::’ when making an explicit type definition for a function which accepts multiple arguments

我第一次在 Haskell 中从事一个项目,我正在努力将我的 ADT 正确地转换成代码,但是当我为我的函数编写显式类型定义并加载时我在 GHCi 中的代码出现以下错误:

Blockquote parse error on input ‘::’

有问题的行是一个名为 type 的函数,它接受一个字符和一个元组以及 returns 一个元组,如下所示:

type :: validChars -> tuple -> tuple

其中 validChars 是有效字符的列表,如果有帮助,我的列表的定义会显示在这里:

tuple = (l, r, b, k)
l = [l | l <- validChars]
m = [m | m <- validChars]
b = [b | b <- validChars]
k = [k | k <- validChars]
validChars = [ chr c | c <-alphanumericChars , c >= 32, c <= 122]
alphanumericChars = [ a | a <- [0..255]]

我通过将其替换为 Chars 类型来检查以确保它不是 validChars 引起的错误,如图所示:

type :: Chars -> tuple -> tuple

但我仍然遇到同样的错误,我是 Haskell 的初学者,所以我可能遗漏了一些重要的东西,但我不确定那到底是什么;我已经看过类似问题的答案,但到目前为止我还没有成功。如有任何帮助,我们将不胜感激。

type 是 Haskell 中的关键字,因此您不能将其用作函数名称。

此外,类型名称在 Haskell 中以大写字母开头,类型中以小写字母开头的任何内容都是类型变量。因此,如果您定义 myFunction :: validChars -> tuple -> tuple,则定义了一个函数,该函数接受两个任意类型的参数并生成与第二个参数相同类型的结果。与 myFunction :: a -> b -> b.

相同

如果你写 myFunction :: Chars -> tuple -> tuple,你得到一个函数,它的第一个参数需要是 Chars 类型(需要存在),第二个参数是任意类型,也是结果的类型。同样,它与 myFunction :: Chars -> a -> a.

相同

请注意,要使其正常工作,您实际上必须在某处定义一个名为 Chars 的类型。如果要获取 Char 的列表,则类型应改为 [Char]

如果你希望第二个参数和结果实际上是元组(而不只是一个任意命名的类型变量tuple),你需要指定一个像(a,b,c,d)这样的元组类型,这将接受任意 4 元组,或特定的东西,如 (Integer, String, String, String),它会接受包含一个 Integer 和三个 String 的 4 元组。