当我跑步时
<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?
答案 0 :(得分:4)
首先,让我们
import qualified Data.Vector as V
以避免输入Data.Vector.zip
。
Haskell的解析规则通常会让初学者感到困惑,但坦率地说,我认为这更多是因为它们太简单而不是太奇怪。简而言之:
f(x)
,(f)x
和(f) (x)
都是相同的,最好只写f x
。解析器根本不考虑在两个令牌之间放置多少空格。
所以在你的例子中,我们可以
给出列表定义本地名称:
l₁ = [1..10]
l₂ = [2..11]
v = V.zip fromList l₁ fromList l₂
此处没有中缀运营商†。
贪婪地收集论据:
v = (V.zip fromList) l₁ fromList l₂
= ((V.zip fromList) l₁) fromList l₂
= (((V.zip fromList) l₁) fromList) l₂
未加密的语言会将其写为zip(fromList, l₁, fromList, l₂)
,这显然不是您想要的。
解决这个问题的最直接方法是括号:
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
。