Haskell,无法解决类型问题:Data.Vector.zip fromList [1..10] fromList [1..10]

时间:2017-09-16 00:16:12

标签: haskell

当我跑步时

<svg id="button-more-people" style="width: 60px; height: 60px;">
    <circle cx="30" cy="30" r="30" fill="#F44336" id="circle-button-more-people"/>
    <text fill="#ffffff" font-size="45" x="11" y="44" font-family="Verdana">+</text>
</svg>

我收到了错误:

无法匹配预期类型'Vector b0'                   实际类型'[整数]'

相反,我必须这样做:

let v = Data.Vector.zip fromList[1..10] fromList[2..11]

fromList是Data.Vector中的Vector类型

有人可以向我解释为什么fromList [1..10]无法在Data.Vector中转换为Vector类型吗?我必须创建v1和v2?

1 个答案:

答案 0 :(得分:4)

首先,让我们

import qualified Data.Vector as V

以避免输入Data.Vector.zip

Haskell的解析规则通常会让初学者感到困惑,但坦率地说,我认为这更多是因为它们太简单而不是太奇怪。简而言之:

  1. 括号/括号仅对其内容进行分组,它们永远不会影响外部的任何内容。因此,f(x)(f)x(f) (x)都是相同的,最好只写f x
  2. 中缀运算符绑定的程度低于任何函数应用程序。
  3. 功能应用程序贪婪地从左到右收集所有内容。
  4. 解析器根本不考虑在两个令牌之间放置多少空格。

    所以在你的例子中,我们可以

    1. 给出列表定义本地名称:

      l₁ = [1..10]
      l₂ = [2..11]
      v = V.zip fromList l₁ fromList l₂
      
    2. 此处没有中缀运营商

    3. 贪婪地收集论据:

      v = (V.zip fromList) l₁ fromList l₂
        = ((V.zip fromList) l₁) fromList l₂
        = (((V.zip fromList) l₁) fromList) l₂
      

      未加密的语言会将其写为zip(fromList, l₁, fromList, l₂),这显然不是您想要的。

    4. 解决这个问题的最直接方法是括号:

      v = V.zip (fromList [1..10]) (fromList [2..11])
      

      ...或者给出他们自己的打包矢量名称

      v₁ = fromList [1..10]
      v₂ = fromList [2..11]
      v = V.zip l₁ l₂
      

      ...或者完全避免写fromList

      {-# LANGUAGE OverloadedLists #-}
      
      v :: V.Vector Int
      v = V.zip [1..10] [2..11]
      

      你可能想知道.中的Data.Vector.zip是怎么回事。这不是中缀运算符.,而是模块限定符符号。这是仅有的两个具有特殊解析规则的“中缀符号”之一(另一个是一元减号):形式Foo.bar(大写Foo且没有空格!)的任何内容都被识别为单个令牌bar来自模块Foo