小编L01*_*man的帖子

Haskell中数据类型的设计

你有什么建议:

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)

haskell algebraic-data-types

4
推荐指数
1
解决办法
316
查看次数

不同的二叉树在Haskell中的定义:哪些获胜?

我习惯了以下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)

或类似的东西.

我写的第二个定义是"扩展最多"的定义,第一个定义介于它和最后一个定义之间.什么是实际和理论上最好的?换句话说,性能和数据类型的设计呢?

binary-tree haskell

4
推荐指数
2
解决办法
658
查看次数

为什么在Haskell中显式推导Show/Read?

我们不能做read someValue :: someDataTypeshow 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)

haskell derived-types

3
推荐指数
3
解决办法
1522
查看次数

为什么在Haskell中处理而不是网络的任何类型?

通过网络发送和接收的数据类型是String或Bytestring.我们不能发送任何其他类型,例如Int,或[Bool]因为一切都通过了Handle.我知道我们可以解析它,即使使用它,read但我认为它不漂亮,也不可靠,也没有效果.

为什么选择这个?是因为它在技术上"不可能",否则,或者因为Network延迟或其他原因只是对C库的绑定?

networking haskell types

3
推荐指数
1
解决办法
179
查看次数

带有Gloss lib的Haskell代码无法编译

我从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)

haskell compiler-errors gloss

1
推荐指数
1
解决办法
319
查看次数

使用haskell中的多模式缩短函数定义

做得更好:

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)

haskell function pattern-matching

1
推荐指数
1
解决办法
124
查看次数