ฉันจึงเขียนเกมฟุตบอลเล็กๆ นี้มาระยะหนึ่งแล้ว และมีสิ่งหนึ่งที่ทำให้เกิดข้อบกพร่อง ฉันตั้งแต่แรกเริ่ม เกมดังกล่าวเป็นไปตาม Yampa Arcade ดังนั้นจึงมีประเภทผลรวมสำหรับ "วัตถุ" ในเกม:
data ObjState = Ball Id Pos Velo
| Player Id Team Number Pos Velo
| Game Id Score
ออบเจ็กต์ตอบสนองต่อข้อความ ดังนั้นจึงมีประเภทผลรวมอีกประเภทหนึ่ง:
data Msg = BallMsg BM
| PlayerMsg PM
| GameMsg GM
data BM = Gained | Lost
data PM = GoTo Position | Shoot
data GM = GoalScored | BallOutOfBounds
กรอบงาน Yampa อาศัยสิ่งที่เรียกว่าฟังก์ชันสัญญาณ ในกรณีของเรา มีฟังก์ชันสัญญาณสำหรับพฤติกรรมของลูกบอล ผู้เล่น และเกม เรียบง่ายอย่างหยาบคาย:
ballObj, playerObj, gameObj :: (Time -> (GameInput, [Msg]))
-> (Time -> (ObjState, [(Id, Msg)]))
เช่น ballObj ใช้ฟังก์ชันที่ให้ค่า GameInput (การกดแป้น สถานะของเกม ...) และรายการข้อความสำหรับลูกบอลโดยเฉพาะในเวลาใดก็ตาม และส่งกลับฟังก์ชันที่ให้ค่าสถานะของลูกบอลและข้อความของลูกบอลไปยังวัตถุอื่น ๆ (ball , เกม, ผู้เล่น) ในเวลาใดก็ตาม ใน Yampa ลายเซ็นประเภทจะดูดีกว่าเล็กน้อย:
ballObj, playerObj, gameObj :: SF (GameInput, [Msg]) (ObjState, [(Id, Msg)])
ลายเซ็นประเภทเครื่องแบบนี้มีความสำคัญสำหรับกรอบงาน Yampa: (อีกครั้ง ทำให้ง่ายขึ้นอย่างหยาบมาก) โดยจะสร้างฟังก์ชันสัญญาณขนาดใหญ่จากรายการฟังก์ชันสัญญาณ 11 + 11 (ผู้เล่น) + 1 (บอล) + 1 (เกม) ที่มีประเภทเดียวกัน (ผ่าน dpSwitch) ที่มันทำงาน (ผ่านการโต้ตอบ)
ตอนนี้ สิ่งที่กวนใจฉัน: การส่ง BallMsg ไปยัง Ball หรือ PlayerMsg ไปยังผู้เล่นก็สมเหตุสมผลแล้ว หากมีใครส่ง GameMsg ไปยัง Ball โปรแกรมก็จะล่ม ไม่มีวิธีใดที่จะให้ตัวตรวจสอบประเภทอยู่ในตำแหน่งเพื่อหลีกเลี่ยงปัญหานี้ได้หรือไม่ เมื่อเร็วๆ นี้ฉันได้อ่าน Pokemon ดีๆ นี้ โพสต์เกี่ยวกับประเภทครอบครัวและดูเหมือนว่าจะมีการเปรียบเทียบอยู่บ้าง บางทีนี่อาจเป็นจุดเริ่มต้น:
class Receiver a where
Msg a :: *
putAddress :: Msg a -> a -> Msg a
data BallObj = ...
data GameObj = ...
data PlayerObj = ...
instance Receiver BallObj where
Msg BallObj = Gained | Lost
(...)
ตอนนี้ฟังก์ชัน SF อาจมีลักษณะดังนี้:
forall b . (Receiver a, Receiver b) => SF (GameInput, [Msg a]) (a, [(b, Msg b)])
นี่จะพาฉันไปที่ไหนก็ได้เหรอ?
[Msg]
กรอบงานจะรู้ได้อย่างไรว่าข้อความใดไปที่วัตถุใด - person n. 1.8e9-where's-my-share m.   schedule 23.05.2013