Ich habe eine Funktion 'GetMin', die den Mindestwert zurückgeben sollte. Diese Funktion verwendet eine andere Funktion 'urvalFun', um diesen minimalen Wert zu bestimmen. Hier ist eine Demonstration von ‚urvalFun‘Erhalten Sie den Minimalwert
get1:: (String,String,Double) -> String
get1 (x,_,_) = x
get2 :: (String,String,Double)-> String
get2 (_,x,_) = x
get3:: (String,String,Double)->Double
get3 (_,_,x) = x
distDiff:: String-> String->[(String,String,Double)] ->Double
distDiff a b diMat = sum [z |(x,y,z)<- diMat, (x == a && y /= b)
|| (y == a && x /= b) ]
urvalFun:: Int -> (String,String,Double)->[(String,String,Double) ]->Double
urvalFun size triple diMat = ((fromIntegral size)-2)*(get3 triple)
- ((distDiff (get1 triple) (get2 triple) diMat) + (distDiff (get2 triple)
(get1 triple) diMat))
Es ist nicht notwendig, diese chunck von Code zu verstehen, das einzige, was wichtig ist, ist, dass, wenn ich beurteilen:
urvalFun 3 ("a","b",0.304) [("a","b",0.304),("a","d",0.52),("a","e",0.824)]
dies -1,03999 auswertet
urvalFun 3 ("a","d",0.52) [("a","b",0.304),("a","d",0.52),("a","e",0.824)]
wird dies beurteilen zu - 0,60799
urvalFun 3 ("a","e",0.824) [("a","b",0.304),("a","d",0.52),("a","e",0.824)]
wird dies zu 1.1e bewerten^-16
jetzt wissen wir, dass mit ("a", "b", 0.304) und [("a", "b", 0.304) Aufruf urvalFun, (“ a "," d ", 0.52), (" a "," e ", 0.824)] erhalten den kleinsten Wert. Ich möchte eine Funktion 'getMin' erstellen, die diesen minimalen Wert (mit dem gleichen Vektor wie in den obigen Beispielen als Parameter) zurückgibt, wie oben gezeigt. Das Problem ist, dass es nicht funktionieren wird ich keine Ahnung, warum
getMin:: [(String,String,Double)]->Double
getMin diMat = inner 0 diMat 2000
where
inner 3 diMat min = min
inner n diMat min
|current > min = inner (n + 1) (diMatMinus ++ [(head diMat) ]) min
|otherwise = inner (n+1) (diMatMinus ++ [(head diMat) ]) current
current = urvalFun (length diMat) (head diMat) diMat
diMatMinus = tail diMat
Versuch zum Beispiel
getMin [("a","e",0.824),("a","d",0.52),("a","b",0.304)]
der^-16
-1.1e evaluieren zu beurteilen, welche nicht will ich das, weil ich möchte, dass das zurückgeht -1.03999
Kann mir hier jemand helfen?
(dieser Code ist ein wenig hoc-Bit-Anzeige, aber es ist im Aufbau, ich bin jetzt einige Tests nur tun)
bemerken, dass ich den Vektor neu angeordnet haben, so dass die Tripel („a“, "b ", 0.304) ist das letzte Element im Vektor.
Sie sagen, Sie den Minimalwert soll in die Liste aber '-1.03999' ist nirgends in der Liste. Vielleicht möchten Sie etwas wie ['MinimumBy'] (http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Foldable.html#v:minimumBy) – pdexter
Sorry, der Header ist ein bisschen irreführend , Ich möchte nicht das Minimum aus einer Liste, ich möchte den minimalen Wert erhalten, der von urvalFun bestimmt wird, wie oben gezeigt –
Sounds genau wie was 'minimumBy' tut, überprüfen Sie das. – pdexter