小编pig*_*ker的帖子

我可以约束一个类型家庭吗?

在我最近的这个答案中,我碰巧打开了这个老板栗(这个程序太旧了,其中一半是莱布尼兹在十七世纪写的,七十年代由我父亲在电脑上写的).我会省去现代的位以节省空间.

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

44
推荐指数
4
解决办法
3648
查看次数

如何使文件I/O更具事务性?

我正在Haskell中编写CGI脚本.当用户点击"提交"时,Haskell程序在服务器上运行,更新(即读入,处理,覆盖)状态文件.然后读取覆盖有时会导致延迟IO的问题,因为我们可能在读完输入之前生成一个大的输出前缀.更糟糕的是,用户有时会在提交按钮上弹跳,并且两个进程实例同时运行,争夺同一个文件!

什么是实施的好方法

transactionalUpdate :: FilePath -> (String -> String) -> IO ()
Run Code Online (Sandbox Code Playgroud)

函数('update')从旧文件内容中计算新文件内容的位置?假设"更新"是严格的是不安全的,但可以假设它是完全的(对部分更新功能的鲁棒性是一种奖励).可以同时尝试事务,但是如果文件是由其他人写入的,则没有事务应该能够更新.在竞争文件访问的情况下,事务可以中止.我们可以假设系统范围内唯一的临时文件名来源.

我当前的尝试写入临时文件,然后使用系统复制命令覆盖.这似乎解决了懒惰的IO问题,但它并没有让我对比赛安全.有没有经过试验和测试的配方,我们可以装瓶?

io haskell

18
推荐指数
1
解决办法
1062
查看次数

Church-style核心中缺少类型变量会发生什么?

这有点深奥,但令人抓狂.在回答另一个问题时,我注意到这个完全有效的程序

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)

haskell types

18
推荐指数
1
解决办法
580
查看次数

如果我们可以禁用功能,错误消息会改善吗?

受到这次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而不会让总部的繁忙人员感到不安?

haskell types compiler-errors

17
推荐指数
2
解决办法
342
查看次数

我可以禁用control-C吗?

有没有办法在常规的shell-Haskell可执行文件中禁用(临时)control-C的中断效果?

背景:我每年都会进行一些练习.这是一个游戏,学生拉链表达式触发模式匹配重写适用,使用hncurses在shell窗口中运行.当学生完成最后一个谜题后,他们会获得一个他们需要发送给我的个人密码.作为Windows老手和Unix新手,当然(非常)懒惰,他们倾向于选择密码并输入control-C.这会产生意外中断程序并导致密码消失的影响.恢复它的唯一方法是重复练习.多么残忍!

虽然还有其他方法可以解决问题(例如,打印警告消息或将密码写入文件),但我很想知道是否有办法禁用control-C.

io haskell

12
推荐指数
2
解决办法
583
查看次数

实例(Param B.ByteString)如何成功消失?

我有一些旧代码用于编译,但现在它没有.我担心我可能会遇到一个包管理问题,我真的很难处理这类事情.我把它简化为一个最小的失败的例子.

{-# 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)

mysql haskell cabal

9
推荐指数
1
解决办法
228
查看次数

我可以让readProcess删除引号吗?

我正在尝试编写一些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,grepbarfs的单个文件.有.test扩展名的文件.

我可以说服readProcess(或类似的东西)发出我想要的命令吗?

io haskell system process

5
推荐指数
1
解决办法
387
查看次数

glib gremlin与GHC 7.4

我正在按照这个过程进行测试,用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 glibcabal 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)

haskell glib

3
推荐指数
1
解决办法
297
查看次数

标签 统计

haskell ×8

io ×3

types ×2

cabal ×1

compiler-errors ×1

glib ×1

mysql ×1

process ×1

system ×1