/ / Haskell, nie można rozwiązać problemu typu: Data.Vector.zip z listy [1..10] z listy [1..10] - haskell

Haskell, nie może rozwiązać problemu typu: Data.Vector.zip fromList [1..10] fromList [1..10] - haskell

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 № 1

Po 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:

  1. 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 prostu f x.
  2. Operatorzy Infix wiążą się mniej ściśle niż jakakolwiek aplikacja funkcji.
  3. 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

  1. podaj definicje list nazwy lokalne:

    l₁ = [1..10]
    l₂ = [2..11]
    v = V.zip fromList l₁ fromList l₂
    
  2. Nie ma tutaj operatorów infix.

  3. 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.