我做了一个守护进程,它使用了一种非常原始的形式ipc(telnet并发送一个按特定顺序排列某些单词的String).我抢购了它,现在JSON用来将消息传递给Yesod服务器.但是,有一些我真的很喜欢我的设计,我不确定我现在的选择.
这就是我在做的事情:
buildManager :: Phase -> IO ()
buildManager phase = do
let buildSeq = findSeq phase
jid = JobID $ pack "8"
config = MkConfig $ Just jid
flip C.catch exceptionHandler $
runReaderT (sequence_ $ buildSeq <*> stages) config
-- ^^ I would really like to keep the above line of code, or something like it.
return ()
Run Code Online (Sandbox Code Playgroud)
buildSeq中的每个函数都是这样的
foo :: Stage -> ReaderT Config IO ()
data Config = MkConfig (Either JobID …Run Code Online (Sandbox Code Playgroud) 我正在深入挖掘Yesod的monad,并遇到过MonadBaseControl.我看了一下hackage doc,迷路了.有人能告诉我它试图解决的问题吗?
既然有办法通过模式匹配来绑定列表的头部和尾部,我想知道你是否可以使用模式匹配来绑定列表的最后一个元素?
我决定今天是我修复一些不必要地在monadic动作中运行的纯函数的那一天.这就是我所拥有的.
flagWorkDays :: [C.Day] -> Handler [WorkDay]
flagWorkDays dayList =
flagWeekEnds dayList >>=
flagHolidays >>=
flagScheduled >>=
flagASAP >>=
toWorkDays
Run Code Online (Sandbox Code Playgroud)
这是flagWeekEnds,截至目前.
flagWeekEnds :: [C.Day] -> Handler [(C.Day,Availability)]
flagWeekEnds dayList = do
let yepNope = Prelude.map isWorkDay dayList
availability = Prelude.map flagAvailability yepNope
return $ Prelude.zip dayList availability
Run Code Online (Sandbox Code Playgroud)
flagHolidays遵循类似的模式.toWorkDays只是将一种类型更改为另一种类型,并且是纯函数.
flagScheduled,flagASAP是monadic行动.我不确定如何将monadic动作与惯用语中的纯函数结合起来flagWorkDays.有人可以帮我解决flagWorkDays,假设flagWeekEnds并且flagHolidays已经变得纯净了吗?
抓住Haskell类型系统的表面,运行:
Prelude> e = []
Prelude> ec = tail "a"
Prelude> en = tail [1]
Prelude> :t e
e :: [a]
Prelude> :t ec
ec :: [Char]
Prelude> :t en
en :: Num a => [a]
Prelude> en == e
True
Prelude> ec == e
True
Run Code Online (Sandbox Code Playgroud)
不知何故,尽管en和ec有不同的类型,但它们都在== e上测试True .我说"某种程度上"不是因为我感到惊讶(我不是),而是因为我不知道允许这个的规则/机制的名称是什么.就好像表达式"[] == en"中的类型变量 "a"被允许采用值"Num"进行评估.同样,当用"[] == ec"测试时,它被允许变成"Char".
我不确定我的解释是否正确的原因是:
Prelude> (en == e) && (ec == e)
True
Run Code Online (Sandbox Code Playgroud)
,因为直觉上这意味着在同一个表达式中,e"同时"假设Num和Char的值(至少我用来解释&&的语义).除非Char的"假设"仅在(ec == e)的评估期间起作用,并且(en == e)是独立评估的,在单独的......减少中?(我在这里猜测一个术语).
然后来了:
Prelude> en == …Run Code Online (Sandbox Code Playgroud) 所以我以编程方式制作了一些表,我想验证它的结构是我认为的.
>Rocko=# \c Rocko
Password for user Rocko:
psql (8.4.4, server 8.4.8)
You are now connected to database "Rocko".
Rocko=# \d
List of relations
Schema | Name | Type | Owner
--------+--------------+----------+-------
public | Email | table | Rocko
public | Email_id_seq | sequence | Rocko
public | Test | table | Rocko
public | Test_id_seq | sequence | Rocko
public | User | table | Rocko
public | User_id_seq | sequence | Rocko
(6 rows)
Run Code Online (Sandbox Code Playgroud)
所以,例如,我想看看Test中的列.
Rocko=# \d Test …
我想用反应性香蕉写一个人们可以写机器人的旅行者游戏.FRP对我来说是全新的,我在开始时遇到了麻烦.当我开始时,我创建了一个更精细的图表,但出于我的目的,我试图让它尽可能简单.我想要一些指导,主要是关于从哪里开始,以及如何将这个更大的问题分解为更小的问题来解决.这是最初的设计.
我们的想法是拥有一个TIode图表(为了简单起见,我现在忽略加权边缘).这些LNode我描述为Planets.该Planet■找一个名字,在地图上的玩家的Planet和Resource秒.玩家拥有一个id,资源和一个Planet.Here是数据结构和一些相关的功能,接下来是更多的讨论.
-- Graph-building records and functions
data PlanetName = Vulcan
| Mongo
| Arakis
| Dantooine
| Tatooine
deriving (Enum,Bounded,Show)
data Planet = Planet {pName :: PlanetName
,player :: IntMap Player
,resources :: Int
} deriving Show
data Player = Player {pid :: Int
,resources :: Int
} deriving Show
makePlanetNodes :: PlanetName -> [LNode Planet]
makePlanetNodes planet = Prelude.map makePlanetNodes' $
zip [planet ..] [0 ..]
where makePlanetNodes' (planet,i) = …Run Code Online (Sandbox Code Playgroud) 这是我用来调查特定monadic动作行为的事件网络示例.我想要一种原则性的方法,而不是这种测试我的代码的特殊方式.我知道如何测试我的功能,但我正在寻找测试行为和事件的最佳实践,给出了新的设计选择reactive-banana 1.0.0
我遗漏了很多,希望我只包括说明问题的必要条件.请告诉我是否应该包含哪些内容,以使问题更加清晰.
makeNetworkDescription :: Parameters -> MomentIO ()
makeNetworkDescription params = mdo
eInput <- fromAddHandler (input params)
eTick <- fromAddHandler (tick params)
let
eValidated :: Event VAC
eValidated = toVAC <$> eInput
eClearBuffer = Clear <$ eBuffer
eBuffer ::Event BufferMap
eBuffer = bBuffer <@ eTick
bBuffer <- accumB (BufferMap (M.empty :: M.Map AID VAC)) $
manageBuffer <$> unionWith (clearBuffer) eValidated eClearBuffer
reactimate $ writeOut_Debug <$> eBuffer
Run Code Online (Sandbox Code Playgroud)
缓冲区应该做的是累积的播放器命令(然后在其他地方处理),然后在处理特定批次的播放器命令后清空.在下一次打勾时,它会再次发生.
我希望确保缓冲区在它应该被清除时被清除,并且像它应该那样累积命令.现在,代码工作,我想编写测试,以确保它在我构建这个游戏时继续工作.
我可以在上面的例子中将缓冲区Behavior与Event网络分开,但那又如何呢?从测试中获得准确结果的最佳方法是什么?
编辑:更新 - 我相信此链接将提供足够的提示.我会对它进行一次尝试并明天报告更多细节. …
我只是设法了解了班级的定义 MonadReader
class Monad m => MonadReader r m | m -> r where
...
Run Code Online (Sandbox Code Playgroud)
在阅读Haskell中的函数依赖文档之后,现在我可以理解,它| m -> r指定类型变量r由唯一地确定m。基于到目前为止我所看到的MonadReader的一些典型实例,我认为这一要求是合理的(例如Reader),但在我看来,Reader即使没有该功能依赖项,我们仍然可以定义实例。
我的问题是,为什么在MonadReader的定义中需要功能依赖?从某种意义上说,在没有MonadReader不能正确定义MonadReader的情况下,这在功能上是必需的吗?还是仅是一种限制,限制了MonadReader的使用方式,以便MonadReader的实例都能以某种预期的方式运行?
我正处于旅行者的关键时刻我正试图处理与游戏状态无关的玩家更新.作为参考,该项目在这里(devel分支是这个问题的相关分支).
Libraries/Universe/GameState.hs有一个功能,updateGS处理游戏状态的所有玩家更新.现在EventNetwork看起来像这样.
makeNetworkDescription :: AddHandler PlayerCommand ->
AddHandler () ->
TChan GameState ->
IO EventNetwork
makeNetworkDescription addCommandEvent tickHandler gsChannel = compile $ do
eInput <- fromAddHandler addCommandEvent
eTick <- fromAddHandler tickHandler
let bGameState = accumB initialGS $ updateGS <$> eInput
eGameState <- changes bGameState
reactimate $ (\n -> (atomically $ writeTChan gsChannel n)) <$> eGameState
Run Code Online (Sandbox Code Playgroud)
实现这个计时器的问题在于我所看到的所有例子都有一个与我的物理模拟不同的用例.这场比赛没有物理参与.我正在尝试使用计时器来评估独立于玩家行为的游戏状态.目前,我唯一想管理的是超空间旅行.当完全实现,从一个行星移动到另一个将改变一个Agent的location到Right Hyperspace.现在需要做的是,当一个tick发生时,distanceTraversed增加一个.然后,如果distanceTraversedequals totalDistance Agent的位置变为Left …
haskell ×9
monads ×3
type-systems ×2
frp ×1
ghc ×1
json ×1
postgresql ×1
types ×1
unit-testing ×1
yesod ×1