想知道如何最好地将Control.Lens包与IORefs 结合起来.具体来说,我希望能够使用atomicModifyIORef镜头,以便我可以提供类型的功能,a -> (a, b)并从操作返回一个值.代码段:
let inc x = (x+1, x)
ior <- newIORef ((1, 1) :: (Int, Int))
thisShouldBe1 <- ior & atomicModifyIORef ?? _1 inc -- this is the bit I'm stuck on
Run Code Online (Sandbox Code Playgroud) 运行 Git commit 时出现以下错误:
c:/Program/ Files/ /(x86/)/Notepad++/notepad++.exe: -c: line 0: syntax
error near unexpected token `('
c:/Program/ Files/ /(x86/)/Notepad++/notepad++.exe: -c: line 0: `c:/Pr
ogram/ Files/ /(x86/)/Notepad++/notepad++.exe \$@\'
error: There was a problem with the editor 'c:/Program/ Files/ /(x86/)
/Notepad++/notepad++.exe'.
Please supply the message using either -m or -F option.
Run Code Online (Sandbox Code Playgroud)
这是什么意思?我该如何修复它?
我所谓的参数部分解决方案是
+ fields: [firstField, secondField] (array[enum], optional)
+ Members
+ firstField
+ secondField
+ extraField
+ dummyField
Run Code Online (Sandbox Code Playgroud)
但它在语义错误上失败了:
参数字段的示例值[firstField,secondField]不在其预期值列表中
我有这个简单的ExprAST,我可以轻松地将其转换为String.
import Prelude hiding (Foldable)
import qualified Prelude
import Data.Foldable as F
import Data.Functor.Foldable
import Data.Monoid
import Control.Comonad.Cofree
data ExprF r = Const Int
| Add r r
deriving ( Show, Eq, Ord, Functor, Prelude.Foldable )
type Expr = Fix ExprF
testExpr = Fix $ Add (Fix (Const 1)) (Fix (Const 2))
convertToString :: Expr -> String
convertToString = cata $ \case
e@(Const x) -> show x
e@(Add x y) -> unwords [x, "+", y]
Run Code Online (Sandbox Code Playgroud)
现在我想添加一个额外的数据.所以我想尝试使用 …
haskell abstract-syntax-tree catamorphism comonad recursion-schemes
我有这种语言AST
data ExprF r = Const Int
| Var String
| Lambda String r
| EList [r]
| Apply r r
deriving ( Show, Eq, Ord, Functor, Foldable )
Run Code Online (Sandbox Code Playgroud)
我想将它转换为字符串
toString = cata $ \case
Const x -> show x
Var x -> x
EList x -> unwords x
Lambda x y -> unwords [x, "=>", y]
Apply x y -> unwords [x, "(", y, ")"]
Run Code Online (Sandbox Code Playgroud)
但是当使用lambda时,Apply我需要括号
(x => x)(1)
Run Code Online (Sandbox Code Playgroud)
但我无法将内部结构与cata相匹配
toString :: Fix ExprF -> String
toString …Run Code Online (Sandbox Code Playgroud) recursion haskell abstract-syntax-tree catamorphism recursion-schemes
为了测量那些Refs的性能,我将GHC生成的组件转储到以下代码中:
import Data.IORef
main = do
r <- newIORef 18
v <- readIORef r
print v
Run Code Online (Sandbox Code Playgroud)
我期望IORef完全被优化掉,只留下一个系统调用来写字符串"18"的stdout.相反,我得到250行组装.你知道有多少人会被执行吗?以下是我认为该计划的核心内容:
.globl Main.main1_info
Main.main1_info:
_c1Zi:
leaq -8(%rbp),%rax
cmpq %r15,%rax
jb _c1Zj
_c1Zk:
movq $block_c1Z9_info,-8(%rbp)
movl $Main.main2_closure+1,%ebx
addq $-8,%rbp
jmp stg_newMutVar#
_c1Zn:
movq $24,904(%r13)
jmp stg_gc_unpt_r1
.align 8
.long S1Zo_srt-(block_c1Z9_info)+0
.long 0
.quad 0
.quad 30064771104
block_c1Z9_info:
_c1Z9:
addq $24,%r12
cmpq 856(%r13),%r12
ja _c1Zn
_c1Zm:
movq 8(%rbx),%rax
movq $sat_s1Z2_info,-16(%r12)
movq %rax,(%r12)
movl $GHC.Types.True_closure+2,%edi
leaq -16(%r12),%rsi
movl $GHC.IO.Handle.FD.stdout_closure,%r14d
addq $8,%rbp
jmp GHC.IO.Handle.Text.hPutStr2_info
_c1Zj:
movl $Main.main1_closure,%ebx
jmp …Run Code Online (Sandbox Code Playgroud) 我尝试将项目从Bitbucket克隆到Android Studio.该项目最初是从Eclipse发布的.
但我得到错误:
克隆失败了.无法启动Git进程.
到目前为止我做了什么:
安装了Bitbucket插件:https://bitbucket.org/dmitry_cherkas/jetbrains-bitbucket-connector/downloads(http://www.goprogramming.space/connecting-android-studio-project-with-bitbucket/)
然后VCS - >从版本控制结账 - > Bitbucket
我有一个登录屏幕.我登录Bitbucket,我可以看到我的项目列表(哇!)然后选择一个项目,然后按确定.- > 克隆失败.无法启动Git进程.
有关如何克隆Bitbucket存储库的任何帮助?
我想实现以下天真(一阶)有限差分函数:
finite_difference :: Fractional a => a -> (a -> a) -> a -> a
finite_difference h f x = ((f $ x + h) - (f x)) / h
Run Code Online (Sandbox Code Playgroud)
正如您可能知道的那样,存在一个微妙的问题:必须确保(x + h)并且可以x用完全可表示的数字来区分.否则,结果有一个巨大的错误,由于(f $ x + h) - (f x)涉及灾难性取消的事实(并且必须仔细选择h,但这不是我的问题).
在C或C++中,问题可以像这样解决:
volatile double temp = x + h;
h = temp - x;
Run Code Online (Sandbox Code Playgroud)
并且volatile修饰符禁用与变量有关的任何优化temp,因此我们确信"聪明"的编译器不会优化这两行.
我还不知道Haskell还不知道如何解决这个问题.恐怕
let temp = x + h
hh = temp - x
in ((f …Run Code Online (Sandbox Code Playgroud) 我的一个朋友刚刚指出了一个有趣的现象......我去了谷歌主页并查看了源代码:
<!doctype html><html><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"><title>Google</title>
...
...
...
A LOT OF STUFF HERE
...
...
...
</script>
Run Code Online (Sandbox Code Playgroud)
...所以我注意到源代码没有结束</body>和</html>标签.使用Chrome的Inspector,它会显示结束标记,但是当我右键单击并查看源代码时,它不在那里.
这里发生了什么?我错过了什么吗?我尝试使用W3C HTML Validator,它显示了一堆错误......
http://validator.w3.org/check?verbose=1&uri=http://www.google.com/
那么......这笔交易是什么?
有代码读取IORef并根据某些条件和计算创建一个新值.现在它将新值写入IORef.但它有可能根本没有改变.新值可能与旧值相同.
关于在编写IORef之前是否检查值是否不同,或者只是编写IORef,需要考虑哪些因素?
writeIORef在设置之前检查值是否已更改?
通过先检查,你可以避免写入并节省一点性能吗?
haskell ×6
ioref ×3
catamorphism ×2
git ×2
apiblueprint ×1
atomic ×1
bitbucket ×1
comonad ×1
git-commit ×1
haskell-lens ×1
html ×1
mson ×1
optimization ×1
performance ×1
recursion ×1
reference ×1
validation ×1
w3c ×1