Haskell ++;还有:在哈斯克尔?

Haskell ++;还有:在哈斯克尔?,haskell,ghci,Haskell,Ghci,我不明白-- 前奏曲>“嗨”+“那里” “这里” 前奏曲>“嗨”:“那里” :12:6: 无法将预期类型“[Char]”与实际类型“Char”匹配 所需类型:[[Char]] 实际类型:[Char] 在“(:)”的第二个参数中,即“there” 在“嗨”这个短语中:“那里” 序曲> 为什么不返回“heree”?我现在明白了。第一个运算符必须是元素,而不是列表 因此,如果我执行'h':“ithere”它将返回“heree”类型。在GCHi中尝试以下操作: Prelude> :t (:) (

我不明白--

前奏曲>“嗨”+“那里”
“这里”
前奏曲>“嗨”:“那里”
:12:6:
无法将预期类型“[Char]”与实际类型“Char”匹配
所需类型:[[Char]]
实际类型:[Char]
在“(:)”的第二个参数中,即“there”
在“嗨”这个短语中:“那里”
序曲>

为什么不返回“heree”?

我现在明白了。第一个运算符必须是元素,而不是列表


因此,如果我执行
'h':“ithere”
它将返回
“heree”
类型。在GCHi中尝试以下操作:

Prelude> :t (:)
(:) :: a -> [a] -> [a]
Prelude. :t (++)
(++) :: [a] -> [a] -> [a]

运算符
是列表的构造函数之一。所以,
“hello”
“h”:“e”:“l”:“l”:“o”:[]
。您可以想象列表的定义如下:(不是真正的haskell语法)

通过获取元素和列表来构造列表。这就是为什么类型是
a->[a]->[a]

连接列表的
++
是通过使用
作为原语来定义的:

(++) :: [a] -> [a] -> [a]
(++) []     ys = ys
(++) (x:xs) ys = x : xs ++ ys

请不要对你的问题发表评论作为回答。你可以添加评论。如果这是你问题的真实答案,你应该将其作为答案发布,没错。但这篇文章并不能回答你的问题;这只是一个评论。在我看来,这篇文章可以被视为一个答案。第一个操作数是
的元素,而
+
的列表是不同的,所以我认为这也是对这个问题的回答。“答案”:“第一个运算符需要是元素,而不是列表。”不是对标题中问题的回答,而是对帖子中问题的回答谢谢你向我介绍
:t
@Micah:另一个非常有用的语法是
:info
,它可以为您提供有关类型的大量信息。请注意,唯一阻止这是真正的Haskell语法的是
[]
。您确实可以使用中缀数据构造函数(例如,
:%
用于
数据。Ratio
,它们必须以
开头,就像前缀数据构造函数必须以大写开头一样),甚至可以使用类型构造函数(
->
就是这样的中缀类型构造函数之一)
data List a = (:) a (List a) | []
(++) :: [a] -> [a] -> [a]
(++) []     ys = ys
(++) (x:xs) ys = x : xs ++ ys