Kiedy biegnę
let v = Data.Vector.zip fromList[1..10] fromList[2..11]
Mam błąd:
Nie można dopasować oczekiwanego typu „Vector b0” z faktycznym typem „[Integer]”
Zamiast tego muszę to zrobić:
let v1 = fromList[1..10]
let v2 = fromList[2..11]
let v = Data.Vector.zip v1 v2
fromList jest typem Vector w Data.Vector
Czy ktoś może mi wyjaśnić, dlaczego fromList [1..10] nie można przekonwertować na typ Vector w Data.Vector? i muszę utworzyć v1 i v2?
Odpowiedzi:
4 dla odpowiedzi № 1Po pierwsze, s
import qualified Data.Vector as V
aby uniknąć konieczności pisania Data.Vector.zip
.
Zasady parsowania Haskella często przeszkadzają początkującym, ale szczerze mówiąc, myślę, że to coś więcej, ponieważ są zbyt prosty raczej niż zbyt dziwnie. W skrócie:
- nawiasy / nawiasy klamrowe grupuj tylko ich zawartość, nigdy nie wpływają na nic na zewnątrz. Więc,
f(x)
,(f)x
i(f) (x)
wszystkie są takie same, najlepiej napisane po prostuf x
. - Operatorzy Infix† wiążą się mniej ściśle niż jakakolwiek aplikacja funkcji.
- Aplikacja funkcji łapczywie zbiera wszystko od lewej do prawej.
Ile spacji umieszczonych między dwoma tokenami nie jest w ogóle uwzględniane przez analizator składni.
W twoim przykładzie możemy
podaj definicje list nazwy lokalne:
l₁ = [1..10] l₂ = [2..11] v = V.zip fromList l₁ fromList l₂
Nie ma tutaj operatorów infix†.
Chciwie zbieraj argumenty:
v = (V.zip fromList) l₁ fromList l₂ = ((V.zip fromList) l₁) fromList l₂ = (((V.zip fromList) l₁) fromList) l₂
Nie-curry języki napisałyby to jako
zip(fromList, l₁, fromList, l₂)
i to wyraźnie nie to, czego chcesz.
Najbardziej bezpośrednim sposobem obejścia tego jest nawias:
v = V.zip (fromList [1..10]) (fromList [2..11])
... lub podaj własne spakowane wektory
v₁ = fromList [1..10]
v₂ = fromList [2..11]
v = V.zip l₁ l₂
... lub unikaj pisania fromList
całkowicie:
{-# LANGUAGE OverloadedLists #-}
v :: V.Vector Int
v = V.zip [1..10] [2..11]
†Możesz się zastanawiać, co jest grane .
w Data.Vector.zip
. To nie jest operator infix .
ale symbol kwalifikatora modułu. Jest to jeden z dwóch „symboli infiksów” ze specjalną zasadą analizowania (drugi to jedyny minus): dowolna forma Foo.bar
(z dużymi literami Foo
i brak białych znaków!) jest rozpoznawany jako pojedynczy token bar
pochodzący z modułu Foo
.