在为接受多个参数的函数创建显式类型定义时,解析输入'::'上的错误

时间:2016-04-15 13:26:21

标签: haskell functional-programming ghci

我是第一次在Haskell上创建一个项目,我正在努力将我的ADT正确地翻译成代码,但是当我为我的函数编写显式类型定义并在GHCi中加载我的代码时,我得到了以下错误:

  

输入'::'

上的Blockquote解析错误

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

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]]

我检查过以确保错误validChars导致错误,将其替换为Chars类型,如下所示:

type :: Chars -> tuple -> tuple

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

1 个答案:

答案 0 :(得分:3)

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和3 String s的4元组。