我撰寫了以下代碼:
type Mass = Double
type Position = (Double, Double)
type Velocity = (Double, Double)
data Body = Body Mass Position Velocity
data System = System [Body]
renderBody :: Body -> Picture
renderBody (Body mass (x, y) velocity) = object
where
object = translated x y (solidCircle mass)
renderSystem :: System -> Picture
renderSystem (System []) = blank
renderSystem (System (x:xs)) = renderBody(x)<>renderSystem(System(xs))
moveBody :: Double -> Body -> Body
moveBody time (Body mass (x, y) (vx, vy)) = new_body
where
new_x = x vx * time
new_y = y vy * time
new_body = (Body mass (new_x, new_y) (vx, vy))
updateSystem :: Double -> System -> System
updateSystem time (System []) = (System [])
updateSystem time (System(x:xs)) = moveBody time x : updateSystem time System(xs)
我無法理解以下錯誤
有什么問題?
提前致謝。
uj5u.com熱心網友回復:
您沒有申請updateSystem timetype 的值System;您將它應用于資料建構式System和Body值串列xs。您需要調整括號以創建必要的 type 值System。
updateSystem time (System(x:xs)) = moveBody time x : updateSystem time (System xs)
但是,您可以updateSystem通過map在System包裝串列上使用來簡化 的定義。
updateSystem :: Double -> System -> System
updateSystem time (System xs) = System (map (moveBody time) xs)
提取 type 的值[Body],映射moveBody time它以獲得一個新的Body's串列,然后將該串列重新包裝為一個新System值。
uj5u.com熱心網友回復:
您可以為您的型別定義自定義前置運算子,例如.:包裝串列前置System:
type Mass = Double
type Position = (Double, Double)
type Velocity = (Double, Double)
data Body = Body Mass Position Velocity
data System = System [Body]
moveBody :: Double -> Body -> Body
moveBody time (Body mass (x, y) (vx, vy)) = new_body
where
new_x = x vx * time
new_y = y vy * time
new_body = (Body mass (new_x, new_y) (vx, vy))
(.:) :: Body -> System -> System
(.:) b (System x) = System (b : x)
updateSystem :: Double -> System -> System
updateSystem time (System []) = (System [])
updateSystem time (System(x:xs)) = moveBody time x .: updateSystem time (System xs)
你會得到一個錯誤,因為System它不是一個串列,所以你不能僅僅通過使用:運算子在它前面加上元素。
您也有一個錯誤的表示法System(xs)而不是(System xs),您應該首先System從串列構造,然后將其傳遞給函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/347704.html
標籤:哈斯克尔
上一篇:Control.Monad.Reader.withReader實際上是Data.Functor.Contravariant.contramap嗎?
