我試圖讓用戶更接近 (20.2,-1.00) 并且得分高于 7。但是我嘗試的一切似乎都不起作用,而且我一直卡住。下面的代碼顯示了我最近的嘗試。任何幫助都會很棒。
data User = User { name :: String
, location :: (Double,Double)
, score :: [Double]
}
user1 = User {name = "BladeBoy", location = (50.45,-1.203),score = [10.2,5.6,7.8]}
user2 = User {name = "Kaslan", location = (60.78,1.003),score = [20,7.6,12.1]}
user3 = User {name = "Ryan", location = (50.0,-0.283),score = [10.2,7.8,7.8]}
users :: [User]
users = [user1,user2,user3]
near7Help :: [(Double, Double)] -> [(Double, Double)]
near7Help (x : xs) = (near7 x ) near7Help >> xs
near7 :: (Double,Double) -> (Double,Double)
near7 x _ = snd . minimum . map (abs . subtract 7 &&& id)
getScores (User _ _ score) = score
-- output user nearest to 50.2,-0.4 and middle score higher than 7
uj5u.com熱心網友回復:
我沒有在作業中看到 adistance和s計算的確切定義。所以我創建了兩個函式來根據需要進行自定義:
s :: [Double] -> Double
distanceFrom :: (Double, Double) -> User -> Double
然后我創建了滿足您的兩個條件的函式:
scoreHigherThan :: Double -> User -> Bool
scoreHigherThan a u
= s (score u) > a
minDistance :: (Double, Double) -> [User] -> User
minDistance a (x:xs) = minDistance' a xs (distanceFrom a x) x
minDistance' :: (Double, Double) -> [User] -> Double -> User -> User
minDistance' _ [] d u = u
minDistance' a (x:xs) d u
| d' < d = minDistance' a xs d' x
| otherwise = minDistance' a xs d u
where d' = distanceFrom a x
然后你所要做的就是打電話:
near7 :: [User] -> User
near7 u = minDistance (50.2,-0.4) (filter (scoreHigherThan 7) u)
下面是一個實作未知函式s和distanceFrom函式的例子:
s :: [Double] -> Double
s x = sum x / fromIntegral (length x)
distanceFrom :: (Double, Double) -> User -> Double
distanceFrom (f,g) User {name = b, location = (c,d), score = e}
= (c-f)^2 (d-g)^2
Edit1:使用minDistancea foldr(沒有顯式遞回):
minDistance :: (Double, Double) -> [User] -> User
minDistance a (b:bs) = snd $ foldr (minDistance' a) (distanceFrom a b,b) bs
minDistance' :: (Double, Double) -> User -> (Double, User) -> (Double, User)
minDistance' p u' (d,u)
| d' < d = (d',u')
| otherwise = (d,u)
where d' = distanceFrom p u'
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474041.html
標籤:哈斯克尔
上一篇:Haskell中的多型值映射
