你有什么建议:
data Direction = Left | Right
type Direction = Bool
newtype Direction = Direction Bool
Run Code Online (Sandbox Code Playgroud)
然后我正在制作:
data Move = WalkRight Bool | Jump
Run Code Online (Sandbox Code Playgroud)
要么
data Move = Walk Direction | Jump
Run Code Online (Sandbox Code Playgroud)
取决于之前的答案.我有一个类型的功能Char -> Maybe Move:
charToAction 'q' = Just $ WalkRight False
charToAction 'd' = Just $ WalkRight True
charToAction 'z' = Just Jump
charToAction _ = Nothing
Run Code Online (Sandbox Code Playgroud)
我应该将我的类型更改Move为:
data Move = Stationary | WalkRight Bool | Jump
Run Code Online (Sandbox Code Playgroud)
?该功能将成为:
charToAction 'q' = WalkRight False
charToAction …Run Code Online (Sandbox Code Playgroud) 我习惯了以下Tree定义:
data Tree a = Empty | Node a (Tree a) (Tree a)
Run Code Online (Sandbox Code Playgroud)
直到我遇到某个地方:
data Tree a = Empty | Leaf a | Node a (Tree a) (Tree a)
Run Code Online (Sandbox Code Playgroud)
这让我对Haskell成语感到疑惑.
既然Leaf a只是Node a Empty Empty,这个构造函数应该存在吗?我们也可以删除Empty,使用像这样的独特构造函数
Tree (Maybe (a, (Tree a), (Tree a)))
Run Code Online (Sandbox Code Playgroud)
或类似的东西.
我写的第二个定义是"扩展最多"的定义,第一个定义介于它和最后一个定义之间.什么是实际和理论上最好的?换句话说,性能和数据类型的设计呢?
我们不能做read someValue :: someDataType或show someValue为每种类型,因为deriving (Show, Read)必须在data声明中写.是否有一个案例,除了错误,我们不希望我们的类型可序列化?为什么Show与Read分开?是否有一个案例,除了错误,我们只想显示一些数据而不读它?如果没有,为什么不使用单一数据类型Serializable?
刚才,我正在使用Gloss库的Key数据类型,它是派生Show而不是Read,我不明白.这很遗憾,因为我想将控件的配置放在一个文件中,然后读取它,这样玩家就可以更改控件并拥有自己的配置.我不得不为Key,SpecialKey和MouseButton做包装,这不是什么大问题但是没用.
data Key' = Char' Char | SpecialKey' SpecialKey | MouseButton' MouseButton
deriving (Eq, Ord, Show, Read)
convertKey x = case x of
Char' c -> Char c
SpecialKey' sk -> SpecialKey sk
MouseButton' mb -> MouseButton mb
Run Code Online (Sandbox Code Playgroud) 通过网络发送和接收的数据类型是String或Bytestring.我们不能发送任何其他类型,例如Int,或[Bool]因为一切都通过了Handle.我知道我们可以解析它,即使使用它,read但我认为它不漂亮,也不可靠,也没有效果.
为什么选择这个?是因为它在技术上"不可能",否则,或者因为Network延迟或其他原因只是对C库的绑定?
我从C++切换到Haskell并使用Gloss来制作游戏.我在main.hs中写了这个有效的代码:
import Graphics.Gloss.Interface.Pure.Game
events (EventKey (Char 'a') Down _ _) _ = RectangleWire 10 10
events _ x = x
main = play (InWindow "GameEvent" (700, 100) (10, 10))
white
100
(Circle 10.0)
id
events
(\_ world -> world)
Run Code Online (Sandbox Code Playgroud)
然后命令ghc main.hs回答:
[1 of 1] Compiling Main ( main.hs, main.o )
main.hs:3:43: Not in scope: data constructor `RectangleWire'
Run Code Online (Sandbox Code Playgroud)
即使我安装了最新版本,我的Gloss lib似乎也缺少一些功能.例如,这个代码,来自gloss-examples包的"Game Event",编译和运行完美(非常漂亮):
import Graphics.Gloss
-- | Display the last event received as text.
main
= play (InWindow "GameEvent" (700, 100) …Run Code Online (Sandbox Code Playgroud) 做得更好:
charToAction 'q' = Just $ WalkRight False
charToAction 'd' = Just $ WalkRight True
charToAction 'z' = Just Jump
charToAction _ = Nothing
Run Code Online (Sandbox Code Playgroud)
要么
charToAction x = case x of
'q' -> Just $ WalkRight False
'd' -> Just $ WalkRight True
'z' -> Just Jump
_ -> Nothing
Run Code Online (Sandbox Code Playgroud)
?