我意识到这可能被认为是一个主观或可能是一个非主题的问题,所以我希望它不会被关闭,而是会被迁移,也许是程序员.
我开始学习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) 是否存在Haskell图形库或绑定到满足以下要求的外部库:
ghci
,即我没有链接和重新启动程序.?
请包含一个最小的源代码示例或对它的引用(只是屏幕上的一个窗口,可能在其中绘制绿线),以便我可以检查点1和2.特别是.此外,如果其中一个功能请求更复杂(例如OpenGL + 4),请包含一个很好的参考.
PS:关于1和2,我知道这个enableGUI
技巧,我愿意使用它.但是,大多数库存在的问题是您无法main
多次运行该函数,因此不符合条件.
编辑:为了避免浪费你的时间,这里列出了我尝试过的软件包:
我有一个工作线程,它从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不再在范围内时.怎么做?
以下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.
我想以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) 简化有序二元决策图(ROBDD)是多变量布尔函数的有效数据结构f(x1,x2,...,xn)
.我想获得一个直觉如何,他们是有效的.
例如,对于数据压缩,我们知道具有低熵的数据(一些符号比其他符号更频繁地出现,多次重复)可以很好地压缩,而完全随机数据不能被压缩.
是否有类似的直觉来估计ROBDD如何有效地表示给定的布尔公式?有关此主题的任何文献(最好是在线)?
compression computer-science data-structures binary-decision-diagram
的包的版本策略指定改变任何实体的类型使得的变化乙数量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?
考虑以下模块
{-# 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
模块?
我不想写类型签名,因为在这种情况下,因为它们是样板文件.如果我必须把它们写下来,这个模块就会失去它的存在理由.
我在一个名为的服务器上有一个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
文件的某些部分.
haskell ×7
cabal ×2
haddock ×2
.htaccess ×1
ajax ×1
cgi ×1
coding-style ×1
command-line ×1
compression ×1
concurrency ×1
ghci ×1
graphics ×1
javascript ×1
macos ×1
mouseover ×1
paint ×1
passwords ×1
php ×1
syntax ×1
terminal ×1
wxwidgets ×1