反应式的更简单的替代库? (哈斯克尔)

2023-11-28

我正在学习 Haskell,并尝试编写一些事件驱动的程序。

以下代码来自教程:http://www.haskell.org/haskellwiki/OpenGLTutorial2

main = do
  (progname,_) <- getArgsAndInitialize
  initialDisplayMode $= [DoubleBuffered]
  createWindow "Hello World"
  reshapeCallback $= Just reshape
  angle <- newIORef (0.0::GLfloat)          -- 1
  delta <- newIORef (0.1::GLfloat)          -- 2
  position <- newIORef (0.0::GLfloat, 0.0)  -- 3
  keyboardMouseCallback $= Just (keyboardMouse delta position)
  idleCallback $= Just (idle angle delta)
  displayCallback $= (display angle position)
  mainLoop

状态存储在IORefs,这使得它看起来就像命令式语言。

我听说还有除此之外的 APIGraphics.UI.GLUT, (e.g. Reactive),但看起来很复杂。

我的方法是lib提供一个函数runEventHandler,并且用户写了一个handler接受列表Events 并将它们转换为IO ().

handler :: [Event] -> IO ()
runEventHandler :: ( [Event] -> IO () ) -> IO ()

And the main函数应该如下所示:

main = runEventHandler handler

有这样的库吗?

我目前正在使用多线程实现一个,但我担心它的性能可能很差......


反应香蕉是一个非常类似于的成熟库reactive。我们不会尝试重新发明一个 frp 库;相反,我们将探索如何将reactive-banana集成到我们自己的项目中。

大局观

为了使用函数式反应式编程库(如带有 OpenGL 的reactive-banana),我们将工作分为 4 部分,其中 2 部分已经存在。我们将使用现有的 GLUT 库与 OpenGL 交互,并使用现有的reactive-banana 库来实现函数式反应式编程。我们将提供我们自己的 2 部分。我们将提供的第一部分是将 GLUT 连接到reactive-banana 的框架。我们将提供的第二部分是根据 frp 实现(reactive-banana)和框架以及 GLUT 类型编写的程序。

我们提供的两个部分都将根据reactive-banana frp 库编写。图书馆有两个伟大的想法,Event t a and Behavior t a. Event t a表示携带类型数据的事件a发生在不同的时间点。Behavior t a表示类型的随时间变化的值a这是在所有时间点定义的。这t类型系统要求我们保留类型参数,否则会忽略。

大部分接口为Event and Behavior隐藏在它们的实例中。Event is a Functor- 我们可以fmap or <$>任意值的函数Event.

fmap :: (a -> b) -> Event t a -> Event t b

Behavior既是Applicative and a Functor。我们可以fmap or <$>所有值 a 的函数Behavior承担,可以提供新的恒定不变的值pure,并计算新的Behaviors with <*>.

fmap :: (a -> b) -> Behavior t a -> Behavior t b
pure :: a -> Behavior t a
<*> :: Behavior t (a -> b) -> Behavior t a -> Behavior t b

有几个反应式香蕉提供的其他功能提供无法用基类型类表示的功能。这些引入了状态性,结合了Events在一起,并在之间进行转换Events and Behaviors.

状态是由accumE它需要一个初始值和一个Event从先前值到新值的变化并产生Event的新价值观。accumB产生一个Behavior instead

accumE :: a -> Event t (a -> a) -> Event t a
accumB :: a -> Event t (a -> a) -> Behavior t a

union将两个事件流组合在一起

union :: Event t a -> Event t a -> Event t a

stepper可以转换一个Event to a Behavior如果我们提供一个初始值以便在所有时间点都定义它,则保留最新值。apply or <@>可以转换一个Behavior进入一个Event如果我们提供一系列Events轮询当前值Behavior.

stepper :: a -> Event t a -> Behavior t a
<@> :: Behavior t (a -> b) -> Event t a -> Event t b

实例为Event and Behavior以及 19 个函数Reactive.Banana.Combinators构成函数反应式编程的整个接口。

总的来说,我们需要 GLUT 库和我们正在实现的 OpenGL 示例使用的库、reactive-banana 库、用于制作框架的reactive-banana 导出和 RankNTypes 扩展、用于线程间通信的几种机制以及读取的能力系统时钟。

{-# LANGUAGE RankNTypes #-}

import Graphics.UI.GLUT
import Control.Monad

import Reactive.Banana
import Reactive.Banana.Frameworks

import Data.IORef
import Control.Concurrent.MVar

import Data.Time

框架接口

我们的框架将映射IO从过剩到反应式香蕉的事件Events and Behaviors。该示例使用了四个 GLUT 事件 -reshapeCallback, keyboardMouseCallback, idleCallback, and displayCallback。我们将把这些映射到Events and Behaviors.

reshapeCallback当用户调整窗口大小时运行。作为回调,它需要某种类型的东西type ReshapeCallback = Size -> IO ()。我们将其表示为Event t Size.

keyboardMouseCallback当用户提供键盘输入、移动鼠标​​或单击鼠标按钮时运行。作为回调,它需要某种类型的东西type KeyboardMouseCallback = Key -> KeyState -> Modifiers -> Position -> IO ()。我们将其表示为类型的输入Event t KeyboardMouse, where KeyboardMouse将传递给回调的所有参数捆绑在一起。

data KeyboardMouse = KeyboardMouse {
    key :: Key,
    keyState :: KeyState,
    modifiers :: Modifiers,
    pos :: Position
}

idleCallback当时间过去时运行。我们将把它表示为一种跟踪已经过去的时间的行为,Behavior t DiffTime。因为它是一个Behavior而不是Event,我们的程序将无法直接观察时间的流逝。如果这不是我们想要的,我们可以使用Event反而。

将所有输入捆绑在一起我们得到

data Inputs t = Inputs {
    keyboardMouse :: Event t KeyboardMouse,    
    time :: Behavior t DiffTime,
    reshape :: Event t Size
}

displayCallback与其他回调不同;它不是用于程序的输入,而是用于输出需要显示的内容。由于 GLUT 可以随时运行它来尝试在屏幕上显示某些内容,因此在所有时间点定义它都是有意义的。我们将用一个表示这个输出Behavior t DisplayCallback.

我们还需要另外一个输出 - 为了响应事件,示例程序偶尔会产生其他 IO 操作。我们将允许程序引发事件以执行任意 IOEvent t (IO ()).

将两个输出捆绑在一起我们得到

data Outputs t = Outputs {
    display :: Behavior t DisplayCallback,
    whenIdle :: Event t (IO ())
}

我们的框架将通过向其传递一个具有以下类型的程序来调用forall t. Inputs t -> Outputs t。我们将定义program and reactiveGLUT在接下来的两节中。

main :: IO ()
main = do
  (progname,_) <- getArgsAndInitialize
  initialDisplayMode $= [DoubleBuffered]
  createWindow "Hello World"
  reactiveGLUT program

该程序

该程序将使用reactive-banana来映射Inputs to the Outputs。要开始移植教程代码,我们将删除IORefs from cubes并重命名reshape to onReshape因为它与我们框架接口中的名称冲突。

cubes :: GLfloat -> (GLfloat, GLfloat) -> DisplayCallback
cubes a (x',y') = do 
  clear [ColorBuffer]
  loadIdentity
  translate $ Vector3 x' y' 0
  preservingMatrix $ do
    rotate a $ Vector3 0 0 1
    scale 0.7 0.7 (0.7::GLfloat)
    forM_ (points 7) $ \(x,y,z) -> preservingMatrix $ do
      color $ Color3 ((x+1)/2) ((y+1)/2) ((z+1)/2)
      translate $ Vector3 x y z
      cube 0.1
  swapBuffers

onReshape :: ReshapeCallback
onReshape size = do 
  viewport $= (Position 0 0, size)

keyboardMouse将完全被取代positionChange and angleSpeedChange。这些转换一个KeyboardMouse事件改变立方体旋转的位置或速度。当事件不需要更改时,他们会返回Nothing.

positionChange :: Fractional a => KeyboardMouse -> Maybe ((a, a) -> (a, a))
positionChange (KeyboardMouse (SpecialKey k) Down _ _) = case k of
  KeyLeft  -> Just $ \(x,y) -> (x-0.1,y)
  KeyRight -> Just $ \(x,y) -> (x+0.1,y)
  KeyUp    -> Just $ \(x,y) -> (x,y+0.1)
  KeyDown  -> Just $ \(x,y) -> (x,y-0.1)
  _        -> Nothing
positionChange _ = Nothing

angleSpeedChange :: Num a => KeyboardMouse -> Maybe (a -> a)
angleSpeedChange (KeyboardMouse (Char c) Down _ _) = case c of
  ' ' -> Just negate
  '+' -> Just (+1)
  '-' -> Just (subtract 1)
  _   -> Nothing
angleSpeedChange _ = Nothing

计算位置相当容易,我们累积键盘输入的变化。filterJust :: Event t (Maybe a) -> Event t a抛出我们不感兴趣的事件。

positionB :: Fractional a => Inputs t -> Behavior t (a, a)
positionB = accumB (0.0, 0.0) . filterJust . fmap positionChange . keyboardMouse

我们将以稍微不同的方式计算旋转立方体的角度。我们将记住速度变化时的时间和角度,应用一个计算角度差与时间差的函数,并将其添加到初始角度。

angleCalculation :: (Num a, Num b) => a -> b -> (a -> b) -> a -> b
angleCalculation a0 b0 f a1 = f (a1 - a0) + b0

计算angle有点困难。首先我们计算一个事件,angleF :: Event t (DiffTime -> GLfloat),保持从时间差到角度差的函数。我们提升并应用我们的angleCalculation到目前的time and angle,并在每次出现时轮询angleF事件。我们将轮询函数转换为Behavior with stepper并将其应用到当前time.

angleB :: Fractional a => Inputs t -> Behavior t a
angleB inputs = angle
    where
        initialSpeed = 2
        angleSpeed = accumE initialSpeed . filterJust . fmap angleSpeedChange . keyboardMouse $ inputs
        scaleSpeed x y = 10 * x * realToFrac y
        angleF = scaleSpeed <$> angleSpeed
        angleSteps = (angleCalculation <$> time inputs <*> angle) <@> angleF
        angle = stepper (scaleSpeed initialSpeed) angleSteps <*> time inputs

整体program maps Inputs to Outputs。它说的是行为的目的display is cubes抬起并应用到角度和位置。这Event对于他人IO副作用是onReshape每次reshape事件发生。

program :: Inputs t -> Outputs t
program inputs = outputs
    where
        outputs = Outputs {
            display = cubes <$> angleB inputs <*> positionB inputs,
            whenIdle = onReshape <$> reshape inputs
        }

框架

我们的框架接受以下类型的程序forall t. Inputs t -> Outputs t并运行它。为了实现该框架,我们使用以下函数Reactive.Banana.Frameworks。这些功能使我们能够提高Events from IO并运行IO响应行动Events。我们可以做Behaviors from Event和民意调查Behaviors when Events 使用以下函数发生Reactive.Banana.Combinators.

reactiveGLUT :: (forall t. Inputs t -> Outputs t) -> IO ()
reactiveGLUT program = do
    -- Initial values    
    initialTime <- getCurrentTime
    -- Events
    (addKeyboardMouse, raiseKeyboardMouse) <- newAddHandler
    (addTime, raiseTime) <- newAddHandler
    (addReshape, raiseReshape) <- newAddHandler
    (addDisplay, raiseDisplay) <- newAddHandler

newAddHandler创建一个句柄来谈论Event t a,以及引发类型事件的函数a -> IO ()。我们为键盘和鼠标输入、空闲时间流逝以及窗口形状变化创建明显的事件。我们还创建了一个事件来轮询display Behavior当我们需要在displayCallback.

我们有一个棘手的问题需要克服 - OpenGL 要求所有 UI 交互都在特定线程中发生,但我们不确定绑定到反应式香蕉事件的操作将在哪个线程中发生。我们将使用几个变量跨线程共享以确保Output IO在OpenGL线程中运行。为了display输出,我们将使用MVar存储轮询的display行动。为了IO排队的操作whenIdle我们将把它们积累在一个IORef,

    -- output variables and how to write to them
    displayVar <- newEmptyMVar
    whenIdleRef <- newIORef (return ())
    let
        setDisplay = putMVar displayVar
        runDisplay = takeMVar displayVar >>= id
        addWhenIdle y = atomicModifyIORef' whenIdleRef (\x -> (x >> y, ()))
        runWhenIdle = atomicModifyIORef' whenIdleRef (\x -> (return (), x)) >>= id

我们的整个网络由以下部分组成。首先我们创建Events(使用fromAddHandler) or Behaviors(使用fromChanges)对于每个Inputs and an Event用于轮询输出display。我们执行少量处理来简化时钟。我们应用program to the inputs我们准备获得该计划的Outputs. Using <@,我们轮询display每当我们的显示事件发生时。最后,reactimate告诉reactive-banana运行setDisplay or addWhenIdle每当对应的Event发生。一旦我们描述了网络,我们compile and actuate it.

    -- Reactive network for GLUT programs
    let networkDescription  :: forall t. Frameworks t => Moment t ()
        networkDescription  = do
            keyboardMouseEvent <- fromAddHandler addKeyboardMouse
            clock              <- fromChanges initialTime addTime
            reshapeEvent       <- fromAddHandler addReshape
            displayEvent       <- fromAddHandler addDisplay
            let
                diffTime = realToFrac . (flip diffUTCTime) initialTime <$> clock
                inputs = Inputs keyboardMouseEvent diffTime reshapeEvent
                outputs = program inputs
                displayPoll = display outputs <@ displayEvent
            reactimate $ fmap setDisplay displayPoll
            reactimate $ fmap addWhenIdle (whenIdle outputs)
    network <- compile networkDescription
    actuate network

对于我们感兴趣的每个 GLUT 回调,我们都会引发相应的reactive-bananaEvent。对于空闲回调,我们还运行任何排队的事件。对于显示回调,我们运行轮询DisplayCallback.

    -- Handle GLUT events
    keyboardMouseCallback $= Just (\k ks m p -> raiseKeyboardMouse (KeyboardMouse k ks m p))
    idleCallback $= Just (do
        getCurrentTime >>= raiseTime
        runWhenIdle
        postRedisplay Nothing)
    reshapeCallback $= Just raiseReshape
    displayCallback $= do
        raiseDisplay ()
        runDisplay
    mainLoop

示例的其余部分

教程代码的其余部分可以逐字重复

vertex3f :: (GLfloat, GLfloat, GLfloat) -> IO ()
vertex3f (x, y, z) = vertex $ Vertex3 x y z    

points :: Int -> [(GLfloat,GLfloat,GLfloat)]
points n = [ (sin (2*pi*k/n'), cos (2*pi*k/n'), 0) | k <- [1..n'] ]
   where n' = fromIntegral n

cube :: GLfloat -> IO ()
cube w = renderPrimitive Quads $ mapM_ vertex3f
  [ ( w, w, w), ( w, w,-w), ( w,-w,-w), ( w,-w, w),
    ( w, w, w), ( w, w,-w), (-w, w,-w), (-w, w, w),
    ( w, w, w), ( w,-w, w), (-w,-w, w), (-w, w, w),
    (-w, w, w), (-w, w,-w), (-w,-w,-w), (-w,-w, w),
    ( w,-w, w), ( w,-w,-w), (-w,-w,-w), (-w,-w, w),
    ( w, w,-w), ( w,-w,-w), (-w,-w,-w), (-w, w,-w) ]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反应式的更简单的替代库? (哈斯克尔) 的相关文章

  • 持久 selectList 导致错误“无法将类型‘BaseBackend backend0’与‘SqlBackend’匹配”

    我遇到以下编译错误 Couldn t match type BaseBackend backend0 with SqlBackend arising from a use of runSqlite The type variable bac
  • Haskell 中的 print 是纯函数吗?

    Is print在 Haskell 中是纯函数 为什么或者为什么不 我认为不是 因为它并不总是返回与纯函数应返回的值相同的值 类型的值IO Int并不是真正的Int 它更像是一张纸 上面写着 嘿 Haskell 运行时 请生成一个Int如此
  • 如何在 Haskell 中向右或向左移动列表的 1 个元素?

    嗨 我一直在寻找答案 但找不到 假设我们有一个像这样的列表 1 10 4 5 3 我怎样才能将 5 向左移动 使这个列表变成 1 10 5 4 3 我尝试过了swapElementsAt通过找到该元素的索引 但它看起来非常不足 swapEl
  • 微服务、amqp 和服务注册/发现

    我正在研究微服务架构 实际上我想知道一些事情 我非常同意使用 返回 服务发现来在基于 REST 的微服务上发出请求 我需要知道发出请求的服务 或至少是服务器集群的前端 在哪里 因此在这种情况下能够发现 ip port 是有意义的 但我想知道
  • WPF 和 WCF 应用程序的用户身份验证/授权的“最佳实践”是什么?

    假设我有一个 NET 富客户端 WPF 应用程序 它将同时部署在 3 个不同的场景中 客户端和服务器代码在单个进程中运行 客户端代码在 Intranet 计算机上运行 并通过 WCF 与运行应用程序 域 基础设施代码的服务器计算机进行通信
  • Haskell 中列表列表的笛卡尔积

    给定一个长度列表的列表x所有子列表的长度都相同y 输出y x长度列表x包含每个子列表中的一项 例子 x 3 y 2 1 2 3 4 5 6 Output 2 3 8不同的输出 1 3 5 1 4 5 1 3 6 1 4 6 2 3 5 2
  • 在 Yesod 生态系统中,对某些文本进行 urlencode 的最佳方式是什么?

    我想对一些文本进行 url 编码 例如 用 20 替换每个空格等 我找到了 HTTP Network HTTP Base urlEncode 并且可以使用它 但我想知道是否还有其他通常在 Yesod 生态系统中使用的东西 不幸的是 由于 U
  • 如何在 Haskell 中漂亮地打印表格?

    我想在 Haskell 中漂亮地打印一个类似表格的数据结构 列列表 例如 Table StrCol strings a bc c IntCol ints 1 30 2 DblCol doubles 2 0 4 5 3 2 应该渲染类似 st
  • 如何在 Haskell 中制作打勾游戏的图案?

    实现有 2 个参数的函数 ticktick 第一个参数是自然数元组 定义游戏场地的行数和列数 第二个列表包含由玩家 x 和玩家 o 轮流玩的坐标给出的井字游戏比赛的记录 打印游戏的实际状态 其中游戏区域将由字符 和 界定 空方块 以及字符
  • Haskell 中的尾递归字符串分割

    我正在考虑分割字符串的问题s在一个字符处c 这表示为 break c s 其中 Haskell 库定义break c 足够接近 br br s h t if c h then s else let h t br t in h h t 假设我
  • Haskell:Data.Numbers.Primes 库在哪里?

    我尝试导入 Data Numbers Primes import Data Numbers Primes 伦哈斯克尔给了我 5 hs 1 8 Could not find module Data Numbers Primes Use v t
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • Web 组件 - 服务/非 html 组件

    所以我来自 Angular 想看看如何创建vanilla Web components 现在 从 Angular 开始 我们倾向于将事物分开 组件 充当 HTML CSS 和一些 javascript 然后是 服务 主要负责收集数据和执行不
  • 如何通过“cabal build”或“stack build”构建带有图标的项目

    我想构建一个带有图标的可执行文件 通过谷歌搜索 我发现这里的说明 https wiki haskell org Setting an executable icon 但它只能通过编译源文件来工作ghc 如果我想构建一个具有可执行文件的项目c
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 如何在不同的分辨率/屏幕上提供相同的应用程序

    Scenario 您需要在不同的屏幕上展示相同的应用程序 假设标准的 15 英寸 17 英寸 便携式 10 英寸和移动 4 英寸 可能在不同的分辨率下工作 Question 您是否尝试采用一种根据可用空间重新排列的流动布局 或者您是否滚动
  • 管道:多个流消费者

    我编写了一个程序来计算语料库中 NGram 的频率 我已经有一个函数 它消耗一串令牌并生成一个订单的 NGram ngram Monad m gt Int gt Conduit t m t trigrams ngram 3 countFre
  • 如何在Haskell中实现词法分析器和解析器

    我在这里得到了这段代码 它是用Haskell结构的命令式编程语言编写的程序 所以问题是 我如何为这种语言实现词法分析器和解析器 该程序被定义为一系列语句有 6 种类型 goto write stop if goto 和 int int n
  • 我是否需要采取明确的操作来促进与持久数据结构的共享?

    我来自命令式背景 正在尝试实现一个简单的不相交集 并集查找 数据结构 以获得在 Haskell 中创建和修改 持久 数据结构的一些练习 目标是有一个简单的实现 但我也关心效率 我的问题与此相关 首先 我创建了一个按等级并集的不相交集森林实现
  • CISC 机器 - 它们不只是将复杂指令转换为 RISC 吗?

    也许我在架构上存在误解 但如果机器有 比如说 乘法指令 该指令是否未转换为更小的指令 或者过于复杂以至于最终与等效的 RISC 指令具有相同的速度 乘法是一个不好的例子 它在两种体系结构中都是一条指令 将上面的 乘法 替换为 CISC 中更

随机推荐

  • 解析转发的电子邮件

    我正在写一些代码parse转发的电子邮件 我不确定是否有一些 Python 库 一些我可以坚持使用的 RFC 或一些其他资源可以让我自动执行任务 准确地说 我不知道转发电子邮件的 布局 是否包含在某些标准或建议中 或者它是否只是多年来才发展
  • VBA公共数组:如何?

    所以今天的问题让我很生气 因为这应该很容易 但我找不到答案 如何在VBA中声明公共数组 我正在使用包含字母 A B C 的数组 因为我正在使用 Excel 单元格 并且我不想在我创建的每个函数中声明它 对吧 我尝试先在网上查看 我读到您必须
  • 何时使用正则表达式与内置字符串方法?

    我注意到关于何时使用正则表达式以及何时使用内置字符串函数 如 String Replace NET 的很多小争论 似乎很多人建议在处理字符串时总是 总是 总是使用正则表达式 除了显示它们之外 这真的是最佳实践还是只是我的错误印象 当问题只是
  • 将图像上传到特定的 Facebook 相册

    我可以使用 facebook graph api 通过将数据发布到来创建相册 http graph facebook com ALBUM ID albums 它返回一个 id 但不是专辑 id 我通过两种方式确认了 通过转到该专辑 援助与我
  • Kotlin verifyError:向后分支 90 上存在未初始化的对象

    我正在使用Kotlin 入门指南使用以下配置在 IntelliJ IDEA 上首次设置 Kotlin IntelliJ IDEA 2017 2 5 Build IC 172 4343 14 built on September 26 201
  • C++ 多重继承 - 为什么你不工作?

    我正在尝试找出一个有趣的多重继承问题 祖父母是一个具有多个方法的接口类 class A public virtual int foo 0 virtual int bar 0 然后是部分完成这个接口的抽象类 class B public A
  • 事件日志监听器 - 应用程序和服务

    有没有办法在生成 应用程序和服务 事件时监视它们 在 C 中 我发现我不能使用 WMI 还有其他想法吗 您可以订阅EventLog EntryWritten 事件 当条目写入本地计算机上的事件日志时发生 来自 MSDN EventLog m
  • iOS8:自定义 Swift 框架访问用 Objective-C 编写的外部框架

    我正在尝试创建一个名为的自定义框架CouchbaseKit Xcode 中的新目标 在 Swift 中 在我的里面CouchbaseKit 我需要访问CouchBaseLite Framework这完全写在Obj C 我在用着Cocoapo
  • 如何从 Android 收件箱短信转换日期格式

    我使用了这段代码 String columnDate new String date Cursor cursor1 getContentResolver query Uri parse content sms inbox columnDat
  • 使用命令行参数启动 .jar 文件(但没有控制台窗口)

    我必须做一个应用程序的演示 该应用程序有一个server jar和client jar 两者都有命令行参数并且都是可执行的 我需要启动两个 server jar 实例和两个 client jar 实例 我认为使用批处理文件是正确的方法 但是
  • Unicode 字符的小写

    我正在研究一个C 需要从中获取数据的项目unicode text 我有一个问题 我无法降低一些unicode character I use wchar t存储从 unicode 文件读取的 unicode 字符 之后 我使用 wcslwr
  • 无法加载类型“System.Web.Optimization.StyleBundle”

    有时 在构建并启动我的 MVC4 Web 应用程序后 我会收到此错误 重建后它可能会消失 也可能不消失 发布到 Windows Azure 后我遇到了同样的问题 有谁知道如何修复这个错误 Server Error in Applicatio
  • Matplotlib 动画未在 PyCharm 中显示

    尝试执行此代码 A simple example of an animated plot import numpy as np import matplotlib pyplot as plt import matplotlib animat
  • 删除 GitHub 存储库的 fork 依赖项

    如何让 GitHub 忘记或取消关联我的存储库最初是另一个项目的分支 我在 GitHub 上分叉了一个项目 我现在可以看到 从任何 任何东西分叉 不再维护父存储库 whatever whatever 我被允许继续使用原始存储库的代码库来创建
  • 如果 SQL 中日期列重叠,则合并行

    我有一个以下格式的表格 Id StartDate EndDate Type 1 2012 02 18 2012 03 18 1 1 2012 03 17 2012 06 29 1 1 2012 06 27 2012 09 27 1 1 20
  • 我可以用逗号将多行分隔为一列吗? [复制]

    这个问题在这里已经有答案了 我正在尝试将这样的内容合并到我的 SQL Server 数据库中 TicketID Person T0001 Alice T0001 Bob T0002 Catherine T0002 Doug T0003 El
  • Cloud Functions Firebase CLI 预部署错误(打字稿)

    我正在尝试使用打字稿使用云功能 安装成功后 添加触发器并测试部署 index ts import as functions from firebase functions export const createAccount functio
  • 如何在Python中解析JSON对象数组

    我收到以下信息JSON数组从POST的响应HTTP要求 username username 1 first name last name roles system admin system user locale en delete at
  • 向 PreferenceActivity 添加标头

    所以我发现android PreferenceScreen对风格不太友好 在显示首选项之前 是否有一种半简单的方法可以将标题 例如图像 添加到首选项屏幕 我目前正在扩展 PreferenceActivity 类 但有人可以告诉我如何向标题添
  • 反应式的更简单的替代库? (哈斯克尔)

    我正在学习 Haskell 并尝试编写一些事件驱动的程序 以下代码来自教程 http www haskell org haskellwiki OpenGLTutorial2 main do progname lt getArgsAndIni