2017-03-28 1 views
0

Ich bin ziemlich neu in Haskell, und ich habe Probleme mit etwas spezifisch. Nämlich eine Liste, die eine Reihe von benutzerdefinierten Typen enthält. Bisher ist dies wo ich bin:Operationen mit einer Liste von benutzerdefinierten Typen

type shots = [(Float,Float)] 

value :: shots -> [Float] 
value [(a,b)] = [(10-(sqrt(a^2+b^2)))] 

Nun, dies scheint zu funktionieren, aber nur für ein Paar von Float-Werten. Was ich hier versuche ist, eine Reihe von Float-Paaren einzufügen, mit der Gleichung zu berechnen und das Ergebnis in eine Liste von Floats zurückzugeben. Ich verstehe, warum es nicht mehr in seiner jetzigen Form braucht (wegen a und b), aber egal wie ich versuche, es in eine Kopf-Schwanz-Schleife zu arbeiten, hört es auf zu funktionieren. Versucht mit fst und snd auch, ohne Erfolg.

+1

Sie suchen definiert für die 'map' Funktion ableiten kann. –

+1

Dies ist keine Antwort, aber ich möchte darauf hinweisen, dass es unmöglich ist, einen Typ zu erstellen, der mit einem Kleinbuchstaben beginnt. Typnamen, die mit einem Kleinbuchstaben beginnen, sind für Typvariablen reserviert. –

Antwort

1

Sie ergeben wird Vielleicht möchten Sie auch die Bausteine ​​lernen. Zum Beispiel können Sie Ihre Funktion für ein Paar schreiben und dann map es zu einer Liste von Paaren.

f (a,b) = 10 - sqrt(a^2 + b^2) 

> map f [(3,4),(5,12)] 
[5.0,-3.0] 

oder im Rahmen Ihrer Funktion

value = map f 
    where f (a,b) = 10 - sqrt(a^2 + b^2) 

wo GHC den Typ

> :t value 
value :: Floating b => [(b, b)] -> [b] 
+0

Das funktioniert definitiv, aber gibt es irgendeine Möglichkeit, Mapping in die bereits bestehende Funktion irgendwie zu integrieren? Wenn ich also die Datei geladen habe, kann ich einfach etwas wie 'value [(2.4.6.1) (6.3,1.2)]' zum Beispiel verwenden und irgendwie die richtige Liste bekommen? – trakk

+0

hinzugefügt innere Funktion Version – karakfa

+0

Vielen Dank, funktioniert wie ein Charme! – trakk

0

Erstellen Sie eine Funktion process, die die Berechnung für ein einzelnes Paar tut

process (a, b) = (10-(sqrt(a^2+b^2))) 

Karte dann diese Funktion über Ihre Liste von Tupeln

fmap process [(1,2),(3,4),(45,55)] 

die

[7.76393202250021,5.0,-61.06335201775947] 
Verwandte Themen