2015-01-12 19 views
5

Questa è una semplice domanda sullo stile. Sto usando:Come si scala un vettore usando la libreria Haskell, Lineare?

import Linear 
point = V3 1 2 3 
scaled = fmap (* 2) point 

Oppure ...

scaled = (* 2) <$> point 

È questo il modo previsto, o c'è una moltiplicazione corretto per operatore scalare?

+0

Il pacchetto ['linear'] (https://hackage.haskell.org/package/linear-1.16) non esporta' Data.Linear', puoi collegarti alla libreria che stai utilizzando? – bheklilr

+0

Woops, era un errore di battitura. Grazie. – MaiaVictor

+0

https://hackage.haskell.org/package/linear-1.20.7/docs/Linear-Vector.html#v:scaled – SwiftsNamesake

risposta

7

La biblioteca linear esporta un'istanza di Num a => Num (V3 a), quindi si può effettivamente fare solo

> point * 2 
V3 2 4 6 

Se si utilizza GHCi, si può vedere che cosa significa per 2 :: V3 Int:

> 2 :: V3 Int 
V3 2 2 2 

Così l'attuazione di fromInteger per V3 apparirebbe

fromInteger n = V3 n' n' n' where n' = fromInteger n 

Questo significa che è possibile fare cose come

> point + 2 
V3 3 4 5 
> point - 2 
V3 (-1) 0 1 
> abs point 
V3 1 2 3 
> signum point 
V3 1 1 1 
> negate point 
V3 (-1) (-2) (-3) 

V3 implementa anche Fractional, così si dovrebbe essere in grado di utilizzare / e co. quando il tuo punto contiene valori Fractional. Tuttavia, l'uso di fmap è più generale, è possibile convertire il vostro V3 Int in V3 String, ad esempio:

> fmap show point 
V3 "1" "2" "3" 

La funzione fmap consente di applicare una funzione di tipo a -> b ad un V3 a per ottenere un V3 b senza alcuna restrizione sul tipo di output (necessariamente così). L'utilizzo di fmap non è sbagliato, non è semplicemente leggibile quanto l'utilizzo dei normali operatori aritmetici. La maggior parte degli Haskellers non avrebbe problemi a leggerlo, tuttavia, fmap è uno strumento molto generale che si presenta per quasi tutti i tipi là fuori.

+0

Oh. È imbarazzante, non mi aspettavo che il tipo fosse così flessibile e stavo cercando una funzione di "scala". Questo ha perfettamente senso. Grazie. – MaiaVictor

+3

@Viclib: beh ... rende sensato, ma non proprio "completo senso". Quella istanza 'Num' è matematicamente piuttosto avventurosa. Ovviamente, Edward sa cosa sta facendo, tuttavia raccomando il [pacchetto vector-space] (http://hackage.haskell.org/package/vector-space) per un'interfaccia migliore. Lo scaling è espresso con ['* ^'] (http://hackage.haskell.org/package/vector-space-0.8.7/docs/Data-VectorSpace.html#v:-42--94-) lì. – leftaroundabout