2016-04-15 84 views
0

我正在第一次在Haskell中进行项目工作,并且正在努力将ADT翻译成正确的代码,然而,当我写了明确的类型定义为我的功能,我打开我的代码在GHCI我得到以下错误:当为接受多个参数的函数进行明确的类型定义时,输入'::'解析错误

Blockquote parse error on input ‘::’

有问题的线是它接受一个字符和一个元组函数调用类型和返回一个元组,如下所示:

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 

但我仍然得到同样的错误,我在哈斯克尔一个完整的初学者,所以我可能失去了一些东西很重要,但我不知道这将是准确;我已经查看了迄今为止我一直不成功的类似问题的答案。任何帮助,这将不胜感激。

+2

'type'是[关键字](https://wiki.haskell.org/Keywords#type)。你的类型也需要从[大写字母](https://en.wikibooks.org/wiki/Haskell/Type_declarations) – HostileFork

+0

开始我觉得这么愚蠢,不检查这一点,非常感谢! :) –

回答

3

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

此外,类型名称以Haskell中的大写字母开头,任何以小写字母开头的类型都是类型变量。所以如果你定义了​​,它定义了一个函数,该函数接受任意类型的两个参数并生成与第二个参数相同类型的结果。这与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元组。

+0

非常感谢!这个评论真的很有帮助,我应该在开始之前检查关键字,以及你知道的越多! –

相关问题