小编Hei*_*mus的帖子

有没有一种很好的方法可以让函数签名在Haskell中提供更多信息?

我意识到这可能被认为是一个主观或可能是一个非主题的问题,所以我希望它不会被关闭,而是会被迁移,也许是程序员.

我开始学习Haskell,主要是为了我自己的教化,我喜欢支持语言的很多想法和原则.在参加了我们玩Lisp的语言理论课之后,我对函数式语言着迷了,而且我听说过很多关于Haskell有多高效的好东西,所以我想我会自己调查一下.到目前为止,我喜欢这种语言,除了一件我无法摆脱的事情:那些母亲正在起作用的功能签名.

我的专业背景主要是做OO,特别是在Java中.我工作过的大多数地方都在许多标准的现代教条中受到重创; 敏捷,清洁代码,TDD等.经过几年的工作,它一定成为我的舒适区; 尤其是"好"代码应该是自我记录的想法.我已经习惯了在IDE中工作,其中具有非常描述性签名的冗长和详细的方法名称对于智能自动完成和用于导航包和符号的大量分析工具来说不是问题; 如果我可以在Eclipse中按Ctrl + Space,那么从查看其名称和与其参数关联的本地范围变量而不是拉起JavaDocs推断出方法正在做什么,我和大便中的猪一样高兴.

这显然不是Haskell社区最佳实践的一部分.我已经阅读了很多关于此事的不同意见,我理解Haskell社区认为其简洁性是"专业人士".我已经阅读如何阅读Haskell,我理解了很多决策背后的理由,但这并不意味着我喜欢它们; 一个字母的变量名称等对我来说并不好玩.我承认,如果我想继续使用该语言,我将不得不习惯这一点.

但我无法克服功能签名.以这个例子为例,从学习Haskell [...]关于函数语法的部分开始:

bmiTell :: (RealFloat a) => a -> a -> String  
bmiTell weight height  
    | weight / height ^ 2 <= 18.5 = "You're underweight, you emo, you!"  
    | weight / height ^ 2 <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!"  
    | weight / height ^ 2 <= 30.0 = "You're fat! Lose some weight, fatty!"  
    | otherwise                   = …
Run Code Online (Sandbox Code Playgroud)

syntax haskell functional-programming coding-style

52
推荐指数
6
解决办法
3514
查看次数

Haskell图形库,适用于MacOS X上的GHCi

是否存在Haskell图形库或绑定到满足以下要求的外部库:

  1. 可以使用ghci,即我没有链接和重新启动程序.
  2. 适用于MacOS X.(Tricky与1一起使用!)
  3. 可以做简单的矢量图形(线条,多边形,简单填充和笔画).
  4. 可以将位图图像放在屏幕上.示例:blit a 17x12 .bmp图像.

请包含一个最小的源代码示例或对它的引用(只是屏幕上的一个窗口,可能在其中绘制绿线),以便我可以检查点1和2.特别是.此外,如果其中一个功能请求更复杂(例如OpenGL + 4),请包含一个很好的参考.


PS:关于1和2,我知道这个enableGUI技巧,我愿意使用它.但是,大多数库存在的问题是您无法main多次运行该函数,因此不符合条件.


编辑:为了避免浪费你的时间,这里列出了我尝试过的软件包:

  • wx - ghci呛到了libstdc++
  • sdl - 重新定义main为宏.仅编译时间.
  • GLFW(OpenGL) - 无法运行main两次,因为"无法安装鼠标事件处理程序而失败".

macos graphics haskell ghci

34
推荐指数
1
解决办法
3647
查看次数

当MVar被垃圾收集时杀死一个线程

我有一个工作线程,它从MVar中反复读取数据并对其执行一些有用的工作.过了一会儿,程序的其余部分忘记了那个工作线程,这意味着它将等待一个空的MVar并变得非常孤独.我的问题是:

如果线程不再写入它,那么MVar会被垃圾收集,例如因为它们都在等待它吗?垃圾收集会杀死等待的线程吗?如果不是,我可以以某种方式向编译器指示MVar应该被垃圾收集并且线程被杀死了吗?

编辑:我应该澄清我的问题的目的.我不希望得到针对僵局的一般保护; 相反,我想要做的是将工作线程的生命与生命值联系起来(如:垃圾收集声称死值).换句话说,工作线程是一种资源,我想不是手工释放,而是当某个值(MVar或衍生物)被垃圾收集时.


这是一个示例程序,演示了我的想法

import Control.Concurrent
import Control.Concurrent.MVar

main = do
    something
    -- the thread forked in  something  can  be killed here
    -- because the  MVar  used for communication is no longer in scope
    etc

something = do
    v <- newEmptyMVar
    forkIO $ forever $ work =<< takeMVar v
    putMVar v "Haskell"
    putMVar v "42"
Run Code Online (Sandbox Code Playgroud)

换句话说,我希望线程在我无法与之通信时被杀死,即当用于通信的MVar不再在范围内时.怎么做?

concurrency garbage-collection haskell

34
推荐指数
3
解决办法
1439
查看次数

在Haskell命令行应用程序中提示输入密码

以下Haskell程序在终端中提示用户输入密码,如果输入正确的密码则继续:

main = do
    putStrLn "Password:"
    password <- getLine

    case hash password `member` database of
        False -> putStrLn "Unauthorized use!"
        True  -> do
                 ...
Run Code Online (Sandbox Code Playgroud)

不幸的是,密码会在用户输入时显示在屏幕上,我想避免使用.

如何在不显示屏幕的情况下读取用户输入的一系列字符?getLine为此目的的等价物是什么?

我在MacOS X上,但我希望这也适用于Windows和Linux.

passwords terminal command-line haskell

26
推荐指数
4
解决办法
2686
查看次数

Haddock,Cabal:如何包含源代码示例?

我是操作包的作者,其中包括示例代码.我想这个示例代码是hscolored并与由Haddock生成的API文档一起安装.

我可能必须使用自定义Cabal构建类型并为Haddock阶段创建用户钩子.但是,我从未设法做到这一点.因此,我的问题是:

如何将完整模块作为示例代码包含在Haddock中?

你能给出一个Cabal用户钩子的例子,它将hscolor应用于另一个源代码文件example.hs并将结果与​​生成的Haddock文档连接起来吗?

haskell documentation-generation cabal haddock

25
推荐指数
1
解决办法
1704
查看次数

在MS Paint上编写绘画程序 - 如何在鼠标移动事件之间进行插值?

我想以MS Paint的风格编写一个绘画程序.

为了在用户移动鼠标时在屏幕上绘画,我必须等待鼠标移动事件并在我收到鼠标时在屏幕上绘图.显然,mose移动事件不经常发送,所以我必须通过在当前鼠标位置和前一个鼠标位置之间画一条线来插值鼠标移动.在伪代码中,这看起来像这样:

var positionOld = null

def handleMouseMove(positionNew):
    if mouse.button.down:
        if positionOld == null:
            positionOld = positionNew
        screen.draw.line(positionOld,positionNew)
        positionOld = positionNew
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:使用直线段进行插值看起来太符合我的口味了,你能推荐一种更好的插值方法吗?GIMP或Adobe Photoshop采用什么方法?

或者,有没有办法增加我收到的鼠标移动事件的频率?我正在使用的GUI框架是wxWidgets.

GUI框架:wxWidgets.
(编程语言:Haskell,但这里不相关)

编辑:澄清:我想要看起来比直线段更平滑的东西,看图片(原始大小):

在鼠标位置之间绘制的锯齿状线条http://i26.tinypic.com/hwa42h.jpg

EDIT2:我使用的代码如下所示:

-- create bitmap and derive drawing context
im      <- imageCreateSized (sy 800 600)
bitmap  <- bitmapCreateFromImage im (-1)    -- wxBitmap
dc      <- memoryDCCreate                   -- wxMemoryDC
memoryDCSelectObject dc bitmap

...
-- handle mouse move
onMouse ... sw (MouseLeftDrag posNew _) = do
    ...
    line dc …
Run Code Online (Sandbox Code Playgroud)

user-interface interpolation wxwidgets paint mouseover

11
推荐指数
1
解决办法
2824
查看次数

用于估计降阶有序二元决策图效率的启发式算法?

简化有序二元决策图(ROBDD)是多变量布尔函数的有效数据结构f(x1,x2,...,xn).我想获得一个直觉如何,他们是有效的.

例如,对于数据压缩,我们知道具有低熵的数据(一些符号比其他符号更频繁地出现,多次重复)可以很好地压缩,而完全随机数据不能被压缩.

是否有类似的直觉来估计ROBDD如何有效地表示给定的布尔公式?有关此主题的任何文献(最好是在线)?

compression computer-science data-structures binary-decision-diagram

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

包版本控制策略 - 无害类型更改?

包的版本策略指定改变任何实体的类型使得的变化数量ABC必要的.

但是,在我看来,某些类型更改不会破坏依赖代码.特别是,请考虑以下示例,其中我删除了一个Typeable类约束:

- foo :: Typeable a => AddHandler a -> NetworkDescription (Event a)
+ foo :: AddHandler a -> NetworkDescription (Event a)
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:

可以在函数break依赖代码上删除类型类约束吗?在引入此更改时,我应该更改B编号还是仅更改ABC版本中的C

haskell cabal

8
推荐指数
1
解决办法
197
查看次数

Haddock:使用推断类型签名记录声明?

考虑以下模块

{-# LANGUAGE RecordWildCards #-}
module Example (foo, fuh, fon, fuzz) where

import qualified FirstClassModule (Bar(foo,fuh,fon,fuzz), makeBar)

FirstClassModule.Bar {..} = FirstClassModule.makeBar parameter

parameter :: Int
parameter = 15
Run Code Online (Sandbox Code Playgroud)

目的是该模块FirstClassModule提供的记录类型Bar有点像第一类模块.然后,模块Example实例化模块并使用RecordWildCards扩展将名称带入范围并使其可导出.

当您在此模块上运行Haddock(版本2.8)时,它将干扰foo函数的类型签名并将它们包含在API文档中.现在,我的问题是:

有没有一种方法来记录所产生的名字foo,fuh中写下自己的类型签名Example模块?

我不想写类型签名,因为在这种情况下,因为它们是样板文件.如果我必须把它们写下来,这个模块就会失去它的存在理由.

haskell documentation-generation haddock

6
推荐指数
1
解决办法
289
查看次数

用JavaScript代替跨域请求

我在一个名为的服务器上有一个JavaScript,kopernikus.science.net它想要访问另一个名为的服务器上的文件galileo.science.net.这是我想到的一个玩具示例:

code residing on  http://kopernikus.science.net/makecalendar.js :

    var request = new XMLHttpRequest();
    request.open("GET","galileo.science.net/calendar", false);
    request.send(null);
    document.getElementById("calendar").innerHTML =
        "<div>" + request.responseText.split('\n')[0] + "</div>";
Run Code Online (Sandbox Code Playgroud)

遗憾的是,由于现代Web浏览器的"相同原始策略",禁止脚本访问不同域上的数据.

当然,我的问题是:

我怎么能访问远程文件?

允许JavaScript之外的解决方案,例如镜像相关文件或调整.htaccess.我有什么选择?哪个需要Web服务器上的最少权限?

有问题的文件是vcalendar格式的日历,它会定期更改.我在共享主机上,没有sysadmin权限,但我可以运行PHP和CGI脚本,并可以更改.htaccess文件的某些部分.

javascript php ajax .htaccess cgi

2
推荐指数
1
解决办法
1237
查看次数