【问题标题】:What is the difference between ++ and : in haskell?++和:在haskell中有什么区别?
【发布时间】:2012-07-19 21:32:03
【问题描述】:

我不明白--

Prelude> "hi"++"there"
"hithere"
Prelude> "hi":"there"

<interactive>:12:6:
    Couldn't match expected type `[Char]' with actual type `Char'
    Expected type: [[Char]]
      Actual type: [Char]
    In the second argument of `(:)', namely `"there"'
    In the expression: "hi" : "there"
Prelude> 

为什么不也返回“这里”?

【问题讨论】:

    标签: haskell ghci


    【解决方案1】:

    类型。在 GCHi 中试试这个:

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

    【讨论】:

    • 感谢您向我介绍:t
    • @Micah:另一个真正有用的是:info,它可以为您提供有关类型的大量信息。
    【解决方案2】:

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

    所以如果我做了'h':"ithere",它将返回"hithere"

    【讨论】:

    • 请不要对您的问题发表评论作为答案。您可以添加评论。
    • 如果这是对您问题的真实答案,您应该将其作为答案发布,这是正确的。但是这篇文章不能回答你的问题;这只是一个评论。
    • 在我看来这篇文章可以算是一个答案。
    • 第一个操作数是: 的元素和++ 的列表这一事实 不同,所以我认为这也是问题的答案.
    • “答案”:“第一个运算符必须是元素,而不是列表。”不是标题中问题的答案,而是帖子中问题的答案
    【解决方案3】:

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

    data List a = (:) a (List a) | []
    

    : 通过获取一个元素和一个列表来构造一个列表。这就是为什么类型是a-&gt;[a]-&gt;[a]

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

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

    【讨论】:

    • 请注意,唯一能阻止这成为真正的 Haskell 语法的是 []。您确实可以拥有中缀数据构造函数(例如Data.Ratio:%,它们必须以: 开头,就像前缀数据构造函数必须以大写开头)甚至类型构造函数(-&gt; 就是这样一种中缀类型构造函数)
    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 2017-11-27
    • 2016-08-07
    • 2016-05-16
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多