在我最近的这个答案中,我碰巧打开了这个老板栗(这个程序太旧了,其中一半是莱布尼兹在十七世纪写的,七十年代由我父亲在电脑上写的).我会省去现代的位以节省空间.
class Differentiable f where
type D f :: * -> *
newtype K a x = K a
newtype I x = I x
data (f :+: g) x = L (f x)
| R (g x)
data (f :*: g) x = f x :&: g x
instance Differentiable (K a) where
type D (K a) = K Void
instance Differentiable I where
type D I = K ()
instance (Differentiable f, Differentiable g) => Differentiable …
Run Code Online (Sandbox Code Playgroud) 我正在Haskell中编写CGI脚本.当用户点击"提交"时,Haskell程序在服务器上运行,更新(即读入,处理,覆盖)状态文件.然后读取覆盖有时会导致延迟IO的问题,因为我们可能在读完输入之前生成一个大的输出前缀.更糟糕的是,用户有时会在提交按钮上弹跳,并且两个进程实例同时运行,争夺同一个文件!
什么是实施的好方法
transactionalUpdate :: FilePath -> (String -> String) -> IO ()
Run Code Online (Sandbox Code Playgroud)
函数('update')从旧文件内容中计算新文件内容的位置?假设"更新"是严格的是不安全的,但可以假设它是完全的(对部分更新功能的鲁棒性是一种奖励).可以同时尝试事务,但是如果文件是由其他人写入的,则没有事务应该能够更新.在竞争文件访问的情况下,事务可以中止.我们可以假设系统范围内唯一的临时文件名来源.
我当前的尝试写入临时文件,然后使用系统复制命令覆盖.这似乎解决了懒惰的IO问题,但它并没有让我对比赛安全.有没有经过试验和测试的配方,我们可以装瓶?
这有点深奥,但令人抓狂.在回答另一个问题时,我注意到这个完全有效的程序
poo :: String -> a -> a
poo _ = id
qoo :: (a -> a) -> String
qoo _ = ""
roo :: String -> String
roo = qoo . poo
Run Code Online (Sandbox Code Playgroud)
在a
检查过程中,类型变量既未解决也未一般化roo
.我想知道GHC的核心语言翻译中会发生什么,这是一种教会风格的System F变体.让我用明确的类型lambdas /\
和类型应用程序来解决问题@
.
poo :: forall a. [Char] -> a -> a
poo = /\ a -> \ s x -> id @ a
qoo :: forall a. (a -> a) -> [Char]
qoo = /\ a -> …
Run Code Online (Sandbox Code Playgroud) 受到这次reddit讨论的启发,我想知道在理解错误信息方面是否存在"Dr Scheme"式辅助初学者方法的技术障碍.一个典型的例子就是臭名昭着
Prelude> 1 "doesn't"
<interactive>:3:1:
No instance for (Num ([Char] -> t0))
arising from the literal `1'
Possible fix: add an instance declaration for (Num ([Char] -> t0))
In the expression: 1
In the expression: 1 "doesn't"
In an equation for `it': it = 1 "doesn't"
Run Code Online (Sandbox Code Playgroud)
假设我们要做出本地假设程序员不会声明新实例.实际上,人们可以在Haskell中仅仅通过前导类进行交互deriving
,所以这种假设对初学者来说并不现实.在这种假设下,上述错误信息将与此无关.我们能改进吗?我们可能仍然需要弄清楚要说多少1
,但我们肯定可以更直接地解决这个问题.
是否还有其他机会根据现实的简化假设重新构建错误消息?注意,我问的问题是根据程序员的经验模型更改错误消息的文本:我不是在本地考虑对哪些代码被认为是错误的任何更改(例如,假设初学者将使用专门的重载事物类型,消除歧义).
后续想法:假设"配置文件"为学生建模,现有错误消息的文本是否包含足够的信息来支持这种转换?也就是说,一个有进取心的黑客是否可以实现一个可懂度增强的后处理器,ghci
而不会让总部的繁忙人员感到不安?
有没有办法在常规的shell-Haskell可执行文件中禁用(临时)control-C的中断效果?
背景:我每年都会进行一些练习.这是一个游戏,学生拉链表达式触发模式匹配重写适用,使用hncurses在shell窗口中运行.当学生完成最后一个谜题后,他们会获得一个他们需要发送给我的个人密码.作为Windows老手和Unix新手,当然(非常)懒惰,他们倾向于选择密码并输入control-C.这会产生意外中断程序并导致密码消失的影响.恢复它的唯一方法是重复练习.多么残忍!
虽然还有其他方法可以解决问题(例如,打印警告消息或将密码写入文件),但我很想知道是否有办法禁用control-C.
我有一些旧代码用于编译,但现在它没有.我担心我可能会遇到一个包管理问题,我真的很难处理这类事情.我把它简化为一个最小的失败的例子.
{-# LANGUAGE OverloadedStrings #-}
module Gremlin where
import Database.MySQL.Simple.Param
import qualified Data.ByteString as SB
foo :: Param x => [x]
foo = []
shoo :: [SB.ByteString]
shoo = foo
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
/.../Gremlin.hs:12:8:
No instance for (Param SB.ByteString) arising from a use of ‘foo’
In the expression: foo
In an equation for ‘shoo’: shoo = foo
Run Code Online (Sandbox Code Playgroud)
但是当我查看源代码时
module Database.MySQL.Simple.Param
(
Action(..)
, Param(..)
, inQuotes
) where
Run Code Online (Sandbox Code Playgroud)
我知道了
import qualified Data.ByteString as SB
Run Code Online (Sandbox Code Playgroud)
和
instance Param SB.ByteString where
render = Escape …
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一些grep
外部运行的代码,然后分析输出.具体来说,我想做
grep <username> *.test
Run Code Online (Sandbox Code Playgroud)
但是,可悲的是,
readProcess "grep" [username, "*.test"]
Run Code Online (Sandbox Code Playgroud)
似乎在参数周围生成带双引号的命令
grep "<username>" "*.test"
Run Code Online (Sandbox Code Playgroud)
并且因为没有名为asterisk-dot-test,grep
barfs的单个文件.有.test
扩展名的文件.
我可以说服readProcess
(或类似的东西)发出我想要的命令吗?
我正在按照这个过程进行测试,用GHC 7.2.2测试安装gtk2hs和相关套件,但我遇到了一些麻烦.我正在使用Mac OS X Lion,通过自制软件安装的glib 2.30.2和ghc 7.4(圣诞节前的候选版本).我想我的gcc版本可能是相关的
bash-3.2$ gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)
Run Code Online (Sandbox Code Playgroud)
在尝试安装glib
依赖项时出现问题cabal install gtk
.我想单独cabal unpack glib
和cabal install
,和我得到这个指针偏执的投诉.
bash-3.2$ cabal install
Resolving dependencies...
Configuring glib-0.12.2...
Building glib-0.12.2...
Preprocessing library glib-0.12.2...
System/Glib/hsgclosure.c: In function 'gtk2hs_closure_marshal':
System/Glib/hsgclosure.c:110:0:
warning: passing argument 1 of 'rts_evalIO' from incompatible pointer type
System/Glib/hsgclosure.c:110:0:
error: void value not ignored as it ought to be
Run Code Online (Sandbox Code Playgroud)
相关文件的相关行是
cap=rts_evalIO(CAP rts_apply(CAP (HaskellObj)runIO_closure, …
Run Code Online (Sandbox Code Playgroud)