- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试进入 Netwire,我已经挖掘以找到文档、介绍、教程等等,但几乎每个教程和现有代码对于 Netwire 5 来说都是过时的,并且使用了 Netwire 4 中不再使用的功能我们。 README有点帮助,但并不是所有的东西都能编译,而且它仍然几乎没有提供足够的信息来开始。
我要求解释或示例只是为了让游戏循环运行并能够响应事件,所以我寻求信息以便我最终知道:
main
. 最佳答案
免责声明:我还没有找到任何使用 Netwire 的大型程序,所以我将要写的一切你都应该持保留态度,因为它是基于我自己使用 Netwire 的经验。我这里使用的例子大多取自from my own library和 attempt at writing a game using FRP ,并且可能不是做事的“正确方式”。
问题 1:基本结构(例如在响应式(Reactive)香蕉中,您如何驱动使用处理程序、定义行为和响应事件的网络描述)。
session :
netwire库作者给了一个really good answer关于netwire程序的基本结构。由于它有点旧,我将在这里概述一些要点。在看wires之前,我们先来看看netwire是如何处理时间的,FRP的底层驱动。不使用测试工具提前时间的唯一方法 testWire
是生产Session
这将有状态地返回时间增量。方式Sessions
保留状态封装在它们的类型中:
newtype Session m s = Session { stepSession :: m (s, Session m s) }
Session
位于 Monad 内(通常是
IO
),每次计算时,都会返回类型为
s
的“时间状态”值。和一个新的
Session
.通常,任何有用的状态
s
可以写成
Timed
可以返回
Real t
的一些实例的值:
data Timed t s
class (Monoid s, Real t) => HasTime t s | s -> t where
-- | Extract the current time delta.
dtime :: s -> t
instance (Monoid s, Real t) => HasTime t (Timed t s)
countSession_ :: Applicative m => t -> Session m (Timed t ())
countSession_
将时间步长作为输入,在本例中为
t
类型的固定值,并产生
Session
其状态值为
Timed t ()
类型.这意味着它们只对
t
类型的单个值进行编码。 ,并且不带有任何附加状态
()
值(value)。在我们讨论电线之后,我们将看到这在评估它们时如何发挥作用。
Wire s e m a b
b
执行以下操作:
a
类型的无功值作为输入m
e
的抑制值s
给出的时间状态s
)的函数,在那个时刻产生一个类型为
b
的新值。 ,以及用于评估下一个
a
类型的输入的新连线.通过返回一个值和一个新的连线,该函数可以通过在函数定义中传播它来包含状态。
switch
之类的内容。 ,其中一条线更改为另一条线以继续执行(例如玩家完成跳跃)。
stepWire :: Monad m => Wire s e m a b -> s -> Either e a -> m (Either e b, Wire s e m a b)
stepWire wire timestate input
完全符合我们之前所说的:它需要一个
wire
并将当前
timestate
传递给它和
input
从之前的电线。然后,在底层 Monad
m
,它要么产生值
Right b
或禁止,值为
Left e
,然后给出用于计算的下一条线。
Session
的值和
Wire
,我们可以构建一个循环,一遍又一遍地做两件事:
import Control.Wire
-- My countLoop operates in the IO monad and takes two parameters:
-- 1. A session that returns time states of type (Timed Int ())
-- 2. A wire that ignores its input and returns an Int
countLoop :: Session IO (Timed Int ()) -> Wire (Timed Int ()) () IO a Int -> IO ()
countLoop session wire = do
(st, nextSession) <- stepSession session
(Right count, nextWire) <- stepWire wire st (Right undefined)
print count
countLoop nextSession nextWire
-- Main just initializes the procedure:
main :: IO ()
main = countLoop (countSession_ 1) $ time >>> (mkSF_ (*2))
m
,然后简单地将当前状态的快照传递给
stepWire
功能。这样做时,我的大部分输入线看起来像这样:
mousePos :: Wire s e (State Input) a (Float, Float)
State
读取鼠标输入。单子(monad)。我用
State
而不是
Reader
为了正确处理键去抖动(这样单击 UI 不会同时单击 UI 下方的某些内容)。状态设置在我的
main
中函数并传递给
runState
,这也做电线步进。像这样的电线的抑制行为可以产生一些优雅的代码。例如,假设您有电线
right
和
left
为您的箭头键产生一个值,如果该键被按下,否则禁止。您可以使用如下所示的线创建角色运动:
(right >>> moveRight) <|> (left >>> moveLeft) <|> stayPut
Alternative
的一个实例, 如果
right
抑制,它只会移动到下一个可能的电线。
a <|> b
只有在
a
时才会禁止和
b
抑制。
Event
系统,但您必须自己制作返回
Event
的电线使用
Control.Wire.Unsafe.Event
.话虽如此,我还没有发现这种抽象比简单的抑制更有用。
关于haskell - Netwire 5 的基本结构是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25338856/
在 Haskell 中,类型声明使用双冒号,即 (::),如 not::Bool -> Bool。 但是在许多语法与 Haskell 类似的语言中,例如榆树、 Agda 、他们使用单个冒号(:)来声明
insertST :: StateDecoder -> SomeState -> Update SomeState SomeThing insertST stDecoder st = ... Stat
如果这个问题有点含糊,请提前道歉。这是一些周末白日梦的结果。 借助 Haskell 出色的类型系统,将数学(尤其是代数)结构表达为类型类是非常令人愉快的。我的意思是,看看 numeric-prelud
我有需要每 5 分钟执行一次的小程序。 目前,我有执行该任务的 shell 脚本,但我想通过 CLI 中的键为用户提供无需其他脚本即可运行它的能力。 实现这一目标的最佳方法是什么? 最佳答案 我想你会
RWH 面世已经有一段时间了(将近 3 年)。在在线跟踪这本书的渐进式写作之后,我渴望获得我的副本(我认为这是写书的最佳方式之一。)在所有相当学术性的论文中,作为一个 haskell 学生,读起来多么
一个经典的编程练习是用 Lisp/Scheme 编写一个 Lisp/Scheme 解释器。可以利用完整语言的力量来为该语言的子集生成解释器。 Haskell 有类似的练习吗?我想使用 Haskell
以下摘自' Learn You a Haskell ' 表示 f 在函数中用作“值的类型”。 这是什么意思?即“值的类型”是什么意思? Int 是“值的类型”,对吗?但是 Maybe 不是“值的类型”
现在我正在尝试创建一个基本函数,用于删除句子中的所有空格或逗号。 stringToIntList :: [Char] -> [Char] stringToIntList inpt = [ a | a
我是 Haskell 的新手,对模式匹配有疑问。这是代码的高度简化版本: data Value = MyBool Bool | MyInt Integer codeDuplicate1 :: Valu
如何解释这个表达式? :t (+) (+3) (*100) 自 和 具有相同的优先级并且是左结合的。我认为这与 ((+) (+3)) (*100) 相同.但是,我不知道它的作用。在 Learn
这怎么行 > (* 30) 4 120 但这不是 > * 30 40 error: parse error on input ‘*’ 最佳答案 (* 30) 是一个 section,它仍然将 * 视为
我想创建一个函数,删除满足第二个参数中给定谓词的第一个元素。像这样: removeFirst "abab" ( 'b') = "abab" removeFirst [1,2,3,4] even =
Context : def fib(n): if n aand returns a memoized version of the same function. The trick is t
我明白惰性求值是什么,它是如何工作的以及它有什么优势,但是你能解释一下 Haskell 中什么是严格求值吗?我似乎找不到太多关于它的信息,因为惰性评估是最著名的。 他们各自的优势是什么。什么时候真正使
digits :: Int -> [Int] digits n = reverse (x) where x | n digits 1234 = [3,1,2,4]
我在 F# 中有以下代码(来自一本书) open System.Collections.Generic type Table = abstract Item : 'T -> 'U with ge
我对 Haskell 比较陌生,过去几周一直在尝试学习它,但一直停留在过滤器和谓词上,我希望能得到帮助以帮助理解。 我遇到了一个问题,我有一个元组列表。每个元组包含一个 (songName, song
我是 haskell 的初学者,我试图为埃拉托色尼筛法定义一个简单的函数,但它说错误: • Couldn't match expected type ‘Bool -> Bool’
我是 Haskell 语言的新手,我在使用 read 函数时遇到了一些问题。准确地说,我的理解是: read "8.2" + 3.8 应该返回 12.0,因为我们希望返回与第二个成员相同的类型。我真正
当我尝试使用真实项目来驱动它来学习 Haskell 时,我遇到了以下定义。我不明白每个参数前面的感叹号是什么意思,我的书上好像也没有提到。 data MidiMessage = MidiMessage
我是一名优秀的程序员,十分优秀!