Attualmente sto lavorando con Haskell da un po 'di tempo, ma sono ben lungi dall'essere un esperto. Ma vedo che l'approccio funzionale alla programmazione mi soddisfa al meglio.Derivative Towers e come utilizzare il pacchetto spazio vettoriale (haskell)
Finora sto lavorando a un progetto per calcolare alcune cose serie, come le correnti e i potenziali irradiati da una data struttura.
Ho seguito il blog scritto da Conal Elliott (eccone altri Linear Maps) che è molto bello e fondamentale.
Purtroppo, mi manca un semplice esempio :)
Per essere più precisi, ho una curva
f:[0,1] in R -> R³
t -> a*e_y + 2*t*e_z
che è una semplice linea retta a (0, a, 2 * t) . Quando voglio calcolare la derivata di f, ad es. per la lunghezza della curva, conosco il risultato matematico, che è abbastanza semplice (0,0,2), ma come faccio a farlo in Haskell, specialmente con il pacchetto vector-space?
Ho molta voglia di usare questa libreria per la sua funzionalità, è esattamente l'approccio avrei preso troppo (ma non sono che molto più avanti sulla strada Haskell)
Quello che ho finora è questo :
{-# LANGUAGE Rank2Types, TypeOperators, FlexibleContexts, TypeFamilies #-}
{-# OPTIONS_GHC -Wall #-}
import Numeric.GSL.Integration
import Data.VectorSpace
import Data.Basis
import Data.Cross
import Data.Derivative
import Data.LinearMap
type Vec3 s = Three s
prec :: Double
prec = 1E-9
f1 :: (Floating s, VectorSpace s, Scalar s ~ s) => s -> s
f1 = id
c1 :: Double -> Vec3 Double
c1 = \t -> linearCombo [((v 0 0 1),f1 t),((v 0 1 0),2)]
derivC :: Double -> Vec3 (Double :> Double)
derivC t = c1 (pureD t)
E 'l'effettiva implementazione della funzione pured, fin qui nulla di che ho cercato opere per ottenere questo frammento di codice per compilare. Ottengo il seguente errore:
tests.hs:26:12:
Couldn't match expected type `Double :> Double'
with actual type `Double'
Expected type: Vec3 (Double :> Double)
Actual type: Vec3 Double
In the return type of a call of `c1'
In the expression: c1 (pureD t)
Failed, modules loaded: none.
C'è anche una libreria grafica che utilizza vector-spazio e c'è anche un esempio su un toro, in cui viene utilizzato pured. Ho cercato di dedurre l'esempio ma non vedo come posso mapparlo al mio problema.
Qualsiasi aiuto sarebbe molto apprezzato.
Grazie in anticipo
PS: non posso postare tutti i link che mi piacerebbe, ma sono disposto a fornire
Bene - Non so molto di queste librerie, ma i tipi non corrispondono. 'pureD :: (LMapDom a s, VectorSpace b s) => b -> a:> b' Quindi il tipo di' pureD t' è 'Double:> Double' ma c1 si aspetta un argomento di' Double'. (Che cosa dice l'errore) – Oliver
Thx Oliver, ho visto anche questo, ma avevo già postato la domanda.Il fatto è, comunque, che non sono chiaro con la derivazione attuale, cioè come cambio la mia funzione in modo che corrisponda alla firma del tipo. Daremo un'occhiata più da vicino alla risposta di mnish. – TheMADMAN