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