情况是,我正在尝试使用Stack安装Netwire.但是,最新的netwire 5.0.1存在一个问题,正如dhobbs报道的那样:http://hub.darcs.net/ertes/netwire/issue/13
由于我不知道何时会解决问题,我下载了回购并自行进行了更改.但是,我不明白如何安装这样的本地修补版本.stack install没有安装到~/.stack.有没有人有想法?
更新
现在我正在使用Stack开发一些其他库.如何让另一个项目使用该库?硬编码相对路径看起来非常难看.
有人指出这是foldM的情况吗?作为可能的重复.现在,我有一个强烈的意见,即可以用相同答案回答的两个问题不一定是重复的!"什么是1 - 2"和"什么是我^ 2"都产生"-1",但不是,它们不是重复的问题.我的问题(已经回答,类似)是关于"函数是否iterateM存在于Haskell标准库中",而不是"如何实现链式monad操作".
当我写一些项目时,我发现自己编写了这个组合器:
repeatM :: Monad m => Int -> (a -> m a) -> a -> m a
repeatM 0 _ a = return a
repeatM n f a = (repeatM (n-1) f) =<< f a
Run Code Online (Sandbox Code Playgroud)
它只执行monadic动作n时间,将前一个结果输入下一个动作.我尝试了一些hoogle搜索和一些谷歌搜索,并没有找到"标准"Haskell附带的任何东西.是否有预定义的正式功能?
为了明确这个问题,我不是在问如何从历史记录中删除单个文件,就像这个问题:Completely remove file from all Git repository commit history。我也不是在询问从 gitignore取消跟踪文件,就像在这个问题中一样:Ignore files that have been commited to a Git repository。
我说的是“更新 .gitignore 文件,然后从历史记录中删除与列表匹配的所有内容”,或多或少类似于这个问题:忽略已提交到 Git 存储库的文件。但是,不幸的是,该问题的答案不适用于此目的,因此我在这里尝试详细说明该问题,并希望找到一个不涉及人工查看整个源树以手动执行过滤器分支的好答案在每个匹配的文件上。
在这里,我提供了一个测试脚本,目前正在执行Ignore files that have been commited to a Git repository的答案中的过程。它将root在 PWD 下删除并创建一个文件夹,因此在运行它之前要小心。我将在代码之后描述我的目标。
#!/bin/bash -e
TESTROOT=${PWD}
GREEN="\e[32m"
RESET="\e[39m"
rm -rf root
mkdir -v root
pushd root
mkdir -v repo
pushd repo
git init
touch a b c x
mkdir -v main
touch main/{a,x,y,z} …Run Code Online (Sandbox Code Playgroud) 临时解决方法
我使用微小的printf解决了这个问题:
可能newlib printf占用了太多内存。此后,PC会更改一些奇怪的东西,从理论上讲,这应该是数组的结尾char[100]。
cp = buf + BUF
Run Code Online (Sandbox Code Playgroud)
稍后它尝试执行
*--cp = something
Run Code Online (Sandbox Code Playgroud)
它崩溃了。内存错误?有很多我不理解的事情。例如,我不确定链接描述文件是否正确,或者syscall函数是否正确。在获得进一步的了解之前,我必须坚持使用小巧的printf。
原版的
我有一个STM32F103RB板(Nucleo),而USART1才可以工作。另外,我测试了Newlib函数,并按puts()预期工作。但是,当我尝试printf()用于整数时,如下所示:
printf("ADC: %d\r\n", test);
Run Code Online (Sandbox Code Playgroud)
如果test < 10程序正常运行,但是test >= 10产生了严重故障。经过一些GDB调试后,我发现它是从vfprintf生成的:
#0 HardFault_Handler () at main.c:136
#1 <signal handler called>
#2 0x08005af4 in _vfprintf_r (data=<optimized out>, fp=0x20000384 <impure_data+852>, fmt0=fmt0@entry=0x20004f57 " \254\264", ap=...,
ap@entry=...) at ../../../../../../newlib/libc/stdio/vfprintf.c:1601
#3 0x08004fd0 in printf (fmt=0x800b4ac "ADC: %d\n\r") at ../../../../../../newlib/libc/stdio/printf.c:52
#4 0x080004e8 in main () at main.c:168
Run Code Online (Sandbox Code Playgroud)
我想不出任何解决方案。这是我的_sbrk():
caddr_t …Run Code Online (Sandbox Code Playgroud) 三个月后更新
我在下面的回答中使用netwire-5.0.1+ sdl,在使用Arrows和Kleisli Arrows进行I/O的功能反应编程结构中.虽然太简单,不能被称为"游戏",但它应该是非常可组合的并且非常可扩展.
原版的
我正在学习Haskell,并尝试用它制作一个小游戏.但是,我想看看小型(规范)文本游戏的结构.我也尽量保持代码尽可能纯净.我现在正在努力了解如何实施:
State,在http://www.gamedev.net/page/resources/_/technical/game-programming/haskell-game-object-design-or-how-functions-can-get-you中试了一下-apples-r3204,但是虽然单个组件可以在有限的步骤中工作和更新,但我看不出如何在无限循环中使用它.如果可能的话,我想看一个基本上最小的例子:
我没有任何可用的代码,因为我无法获得最基本的东西.我在网上找到的任何其他材料/示例都使用其他一些库,比如SDL或GTK驱动事件.我发现在Haskell中完全写的唯一一个是http://jpmoresmau.blogspot.com/2006/11/my-first-haskell-adventure-game.html,但是那个在主循环中看起来不像是一个尾递归(同样,我不知道这是否重要).
或者,可能Haskell不打算做这样的事情?或者我可能应该放入mainC?
编辑1
所以我在https://wiki.haskell.org/Simple_StateT_use中修改了一个小例子,使它更简单(并且它不符合我的标准):
module Main where
import Control.Monad.State
main = do
putStrLn "I'm thinking of a number between 1 and 100, can you guess it?"
guesses <- execStateT (guessSession answer) 0
putStrLn $ "Success in " ++ (show guesses) ++ " tries."
where
answer = …Run Code Online (Sandbox Code Playgroud) 我目前正在研究RISC-V的规范,规范版本为2.2,Privileged Architecture版本为1.10.在RISC-V规范的第2章中,提到"......虽然简单的实现可能会覆盖8个SCALL/SBREAK/CSRR*指令,并且只有一条SYSTEM硬件指令总是陷阱......"
但是,当我查看特权规范时,该指令MRET也是一条SYSTEM指令,需要从陷阱返回.现在我很困惑需要多少机器级ISA:是否可以省略所有M级CSR并使用软件处理程序来处理任何SYSTEM指令,如规范中所述?如果是这样,如何传递返回地址和陷阱等信息?它们是通过常规寄存器x1-x31完成的
或者,如果我的目标是仅具有M级特权的简单嵌入式核心,那么仅仅实现以下M级CSR就足够了吗?
mvendorid
marchid
mimpid
mhartid
misa
mscratch
mepc
mcause
Run Code Online (Sandbox Code Playgroud)
最后,这些CSR可以省略多少?
我试图通过编写自己的启动代码和链接器脚本来学习ARM处理器的启动过程.我使用的芯片是LPC810,我按照http://midibel.com/blink0.html中的示例进行操作,两个示例都在我的电路板上工作,所以电路没问题.然后,我尝试实现Exception和IRQ处理程序的完整列表,但随后代码无法启动.我只有一个从NUCLEO板上断开的st-link但我不知道如何调试它.此外,LPC芯片只是插在面包板上,所以我会尽量避免连接更多的电线,因为ISP编程线已经使用或阻塞了许多孔.
这是链接器脚本lpc810.ld:
ENTRY(Reset_Handler);
MEMORY {
FLASH(rx) : ORIGIN = 0x0, LENGTH = 0x1000 /* 4K */
RAM(rwx) : ORIGIN = 0x10000000, LENGTH = 0x400 /* 1K */
}
SECTIONS {
. = ORIGIN(FLASH);
.text : {
KEEP(* (.isr_vectors));
. = ALIGN(4);
__vec_end__ = .;
/*. = 0xC4;*/ /* End of vectors */
* (.text);
. = ALIGN(4);
__end_text__ = .;
} > FLASH
__flash_sdata__ = .;
.data : AT(__flash_sdata__){
__data_start__ = .;
* (.data);
. = …Run Code Online (Sandbox Code Playgroud) 我有这种格式的计算:s -> a -> s,s某种状态的类型在哪里.这种功能的结果也是下一次评估的状态.例如,
appendInt :: String -> Int -> String
appendInt s i = s ++ (show i)
Run Code Online (Sandbox Code Playgroud)
然后,appendInt "Int: " 1将给予"Int: 1",同时(appendInt $ appendInt "Int: 1") 2将给予"Int: 12".但是,我找不到将这种计算放在StateMonad中的方法.
第一个猜测是s -> (s,s),但后来a不能传入.然后,我尝试了(a -> s) -> (s, a -> s),但是再次不可能s没有a.s -> (a,s)将无法工作,因为a输入而不是输出.
那我该如何包装这个计算呢?是State单子适合这个?
monads haskell functional-programming state-monad continuation-passing
当我阅读SDLhaskell 的文档时,我发现一些函数不可避免地修改了它的输入.例如,blitSurface将目标曲面作为输入,但在函数内更新.现在,概括问题,如果我有一个函数f :: a -> IO a,如果我a在函数内修改它会破坏组合吗?怎么样f :: IO a -> IO a?怎么样a -> IO ()?那怎么样IO a -> IO ()?
考虑到blitSurface实际上是外来函数的情况,并且每帧的新表面听起来效率不高,这些函数很难避免.这些功能会导致更大规模的问题吗?例如,使用fModifySurface :: Surface -> IO ()破坏性更新作为示例:
main = do
w <- ... -- The window surface
-- Do something here
s <- someFuncGetSurface -- We get a surface here
fModifySurface s -- Destructively update s
blitSurface ...... -- Ignore the actual API, …Run Code Online (Sandbox Code Playgroud)