最小値を返す関数 'getMin'があります。この関数は、この最小値を決定するために別の関数 'urvalFun'を使用します。最小値を取得
urvalFun 3 ("a","b",0.304) [("a","b",0.304),("a","d",0.52),("a","e",0.824)]
これは-1.03999と評価されます:ここでは、重要である唯一の事は、私が評価する場合、そのコードのこのchunckを理解する必要はない「urvalFun」
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))
そののデモです
これは、と評価されますurvalFun 3 ("a","d",0.52) [("a","b",0.304),("a","d",0.52),("a","e",0.824)]
から0.60799
urvalFun 3 ("a","e",0.824) [("a","b",0.304),("a","d",0.52),("a","e",0.824)]
これは今、私たちは「(、( "A"、 "B"、0.304)および[( "A"、 "B"、0.304)とurvalFun呼び出すことを知ってい1.1E^-16
と評価されますa "、" d "、0.52)、(" a "、" e "、0.824)]が最小の値を取得します。上記のように、この最小値(パラメータとして上記の例と同じベクトル)を返す関数 'getMin'を作成します。問題は、それが
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
ではありません
-16 ^例えば-1.1eと評価されます
getMin [("a","e",0.824),("a","d",0.52),("a","b",0.304)]
を評価しようと、なぜ私は見当がつかない動作しないことです私はこれを返すために私が意図したかった-1.03999
誰かが私を助けてくれますか?
が(このコードは少し広告ホックであるが、それは、私はちょうど今、いくつかのテストをやって建設中である)私はそのようベクトルを再配置している通知をトリプル(「A」、「B "、0.304)は、ベクトルの最後の要素です。
あなたは最小値を'-1.03999'のリストはどこにもありません。おそらく、あなたは['minimumBy'](http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Foldable.html#v:minimumBy) – pdexter
のようなものを望みます。ヘッダーは少し誤解を招くリストから最小値を取得したくない場合は、上記のようにurvalFunによって決定される最小値を取得したい –
'minimumBy'とまったく同じように聞こえるので、チェックしてください。 – pdexter