小编Dou*_*hen的帖子

有没有一种很好的方法可以让函数签名在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
查看次数

在JavaScript事件代码中使用匿名函数而不是命名函数进行回调和参数有什么好处?

我是JavaScript的新手.我理解这个语言的许多概念,我一直在阅读原型继承模型,而且我正在用越来越多的交互式前端东西吹口哨.这是一种有趣的语言,但我总是被回调意大利面关闭,这是很多非平凡互动模型的典型特征.

对我来说一直以来都很奇怪的是,尽管可读性噩梦是JavaScript嵌套回调的嵌套,但在很多示例和教程中我很少看到的一件事是使用预定义的命名函数作为回调参数.白天我是一名Java程序员,并且放弃了关于企业名称的陈规定型单元代码单元我喜欢用一种具有强大功能的IDE选择的语言来享受的是使用有意义的,如果长,名称可以使代码的意图和含义更加清晰,而不会使实际生产变得更加困难.那么为什么不在编写JavaScript代码时使用相同的方法呢?

考虑到这一点,我可以提出支持和反对这一观点的论据,但我对该语言的天真和新颖性使我无法得出任何结论,为什么这在技术层面上是好的.

优点:

  • 灵活性.具有回调参数的异步函数可以通过许多不同的代码路径之一到达,并且可能不得不编写命名函数来考虑每个可能的边缘情况.
  • 速度.它对黑客心态起着重要作用.把东西固定在它上面直到它起作用.
  • 其他人都在这样做
  • 较小的文件大小,即使非常简单,但每一点都在网络上.
  • 更简单的AST?我假设匿名函数是在运行时生成的,因此JIT不会将名称映射到指令,但我只是在猜测.
  • 更快的调度?也不确定这个.再猜一次.

缺点:

  • 这是可怕的,不可读的
  • 当你在一系列回调中深深嵌套时,它会增加混乱(公平地说,这可能意味着你开始编写构造不良的代码,但这很常见).
  • 对于没有功能背景的人来说,这可能是一个奇怪的概念

有这么多现代浏览器显示出比以前更快地执行JavaScript代码的能力,我没有看到使用匿名回调可能获得的任何微不足道的性能获得是必要的.看来,如果您处于使用命名函数是可行的情况(可预测的行为和执行路径),那么就没有理由不这样做.

那么有什么技术原因或陷阱我不知道这使得这种做法如此普遍吗?

javascript coding-style callback anonymous-function code-readability

44
推荐指数
3
解决办法
3万
查看次数

为Haskell积极开发和记录良好的GUI工具

我花了很多时间在早上和下午在Haskell中使用GUI框架,因为我需要一些可视化和交互功能,而且我不喜欢在Haskell中编写我的核心功能然后在前端写出来在另一个GUI中; 我宁愿用一种语言来做这一切.更好的部分更好的部分用于编译和修补源代码,或谷歌搜索模糊的编译错误.

我花了很多时间阅读SO问题,在haskell.org上有充足的时间,并且有充足的时间阅读文档.我遇到的是一大堆过时或记录不完整的信息.我可以归结为这三件事:

  1. 在Gtk +绑定之上构建了大量选项.我不喜欢的Gtk +非常多,主要是因为我觉得这是很碍眼,尤其是在OS X上发牢骚的UI看出来的地方和/或只是简单的丑陋似乎很傻,但重要的是要我.特别是如果我希望其他人使用我创建的任何程序.

  2. wxHaskell,稳定且非常容易安装,但许多现有的教程似乎是WX-0.1X和桥接wxWidgets的2.9.x的文档,以WX-0.90.x的约定是非常非常参差不齐,很难神交,什么时候他们甚至存在

  3. qtHaskell,这似乎是大多抛弃(纠正我,如果我错了),只能用GHC的新版本编译应用岁的补丁之后,并吐出这表明它们将很快成为编译错误警告的巨量更新版本的GHC.

实际上,我正在寻找Haskell对Java Swing的回答; 一个强大,维护,文档齐全,易于入门的图书馆,尝试在外观和感觉上保持原生,可以跟上GHC的发展速度,而不是放弃的高风险.这似乎正好是零GUI框架,但随后似乎最"官方"的资源/维基/页/关于GUI框架文档都远远没有维护,所以我决定把对社会,看看是否有什么我只是没找到.我不是非常担心框架是跨平台的,只要它适用于现代版本的OS X.

重申一下,我并不是真的想找个人给我发一个链接到haskell.org或WikiBook.我去过那里,我不喜欢我所看到的.那里的大多数信息都是过时的,它只能创造更多的工作,而不是更少.

我意识到我的"要求"有点极端,特别是对于像Haskell这样的小社区的语言,但我希望那里的某个人可以帮助我.与此同时,我打算只是试着骑出wxHaskell或qtHaskell直到我成功或死亡.

我希望我不要粗暴或疲惫不堪.

user-interface haskell

33
推荐指数
1
解决办法
1333
查看次数

Haskell递归和内存使用

我对使用递归替换循环的想法感到满意.我正在摆弄一个宠物项目,我想测试一些文本输入功能,所以我写了一个小命令行界面,重复询问输入,直到它收到一个特定的退出命令.

它看起来像这样:

getCommandsFromUser = do
    putStrLn "Enter command: "
    keyboardInput <- getLine
    let command = map toLower keyboardInput
    if command == "quit"
        then 
            putStrLn "Good-bye!"
        else do
            -- stuff
            -- more stuff
            putStrLn ("Sending command: " ++ commandURI)
            simpleHTTP $ getRequest commandURI
            getCommandsFromUser

main = do
    getCommandsFromUser
Run Code Online (Sandbox Code Playgroud)

这完全按照预期工作,但是来自C/Java背景,它仍然刺激了我大脑深处,黑暗,无意识的部分,让我想要在蜂巢中爆发,因为我不能动摇每一个递归调用的想法getCommandsFromUser正在创建一个新的堆栈框架.

现在,我对IO,monads,状态,箭头等一无所知.我还在通过Real World Haskell工作,我还没有达到那个部分,而且这些代码中的一些与我在Google上找到的东西相匹配.

另外,我知道GHC的重点在于它是一个令人抓狂的优化编译器,旨在完成令人难以置信的事情,例如美丽展开尾递归函数等.

那么有人可以解释这个实现是否"正确",如果是这样,我可以向我解释幕后会发生什么事情,如果将这个程序放在无数猴子的手中,这会阻止这个程序爆炸?

我知道尾调用优化是什么.在这种情况下,我更关心它是如何工作的,那些动作和一般功能杂质会发生什么.

这个问题并不是基于我对Haskell如何使用堆栈感到困惑的想法,而是我期望它像命令式语言一样工作; 它的基础是我不知道Haskell如何处理堆栈,并想知道它与传统的C语言有什么不同.

memory recursion haskell functional-programming

25
推荐指数
2
解决办法
4602
查看次数

在Haskell中,使用takeWhile或在此列表理解中使用"常规"不等式有什么区别?

我正在努力学习一个Haskell(非常好),而我正在做的许多不同的事情之一是试图解决一些Project Euler问题,因为我正在测试我的勇气.

在做一些基于Fibonacci的问题时,我偶然发现并开始使用Fibonacci序列的递归无限列表版本:

fibs = 1 : 2 : zipWith (+) fibs (tail fibs)

对于其中一个PE问题,我需要提取甚至斐波纳契数小于4,000,000的子序列.我决定用列表理解来做这件事,在我玩代码时,我偶然发现了一些我不太了解的东西; 我假设我对Haskell的懒惰评估方案的掌握很弱,这使得事情复杂化.

以下理解工作正常:

[x | x <- takeWhile (<= 4000000) fibs, even x]

下一个理解永远旋转; 所以我经历并将输出返回到stdout,当它停在正确的位置时,它似乎继续永远地评估递归定义的列表,而不是在达到上限值后完成; 指示列表中的最后一项使用逗号打印但不存在其他列表项或结束方括号的事实:

[x | x <- fibs, x <= 4000000, even x]

那么各种功能使用的秘密酱究竟是什么呢?

haskell functional-programming lazy-evaluation

13
推荐指数
1
解决办法
5270
查看次数

在Haskell中是否有任何现成的词法分析解决方案,允许运行时动态词典?

我正在研究一个小的Haskell项目,该项目需要能够将一小部分严格形成的英语用于令牌以进行语义分析.对于具有许多不同末端效应器的系统而言,它是一种非常天真的自然语言接口,而不是可以发出的命令.我目前正在使用Alex,但Alex依赖其词典进行静态编译.系统的性质使得世界上的末端效应器的数量甚至类型可以在编译之后增加和减少,因此我需要能够在运行时从词典中添加或移除可行的令牌.

我已经尝试过寻找动态lexing解决方案,而我最接近的是这款动态Lexer引擎,自2000年以来看起来并没有更新.

我一直在考虑一些技术,比如使用较低级别的方法(也许是Attoparsec),甚至为Alex配置重新编译钩子并将词法分析器与应用程序的其余部分分开.

这种词汇分析有哪些众所周知的解决方案?我打算最终通过自然语言处理为工作程序员工作,所以我可以采用一种不那么简化的方法,但目前基本的词法分析器是我需要的.

haskell nlp lexical-analysis alex

7
推荐指数
1
解决办法
268
查看次数

"自定义"传感器事件率似乎不适用于SensorManager.registerListener(SensorEventListener侦听器,传感器传感器,int率)

更新:

通过引入类范围静态计数器并且忽略了x个事件,我能够解决我遇到的具体问题.但是我仍然想知道我做错了什么:用微秒的提示注册监听器而不是使用四个给定常量中的一个.


我的应用程序中的一项活动是让传感器参与获取设备的方向,确定滚动并使用它.

我在用

SensorManager.registerListener(SensorEventListener listener, Sensor sensor, int rate)

注册我的传感器.从Android文档获取此方法:

参数

[...]

速率传感器事件在.这只是对系统的暗示.可以比指定的速率更快或更慢地接收事件.通常会更快地收到事件.该值必须是SENSOR_DELAY_NORMAL,SENSOR_DELAY_UI,SENSOR_DELAY_GAME或SENSOR_DELAY_FASTEST之一,或者是事件之间所需的延迟(以微秒为单位).

如果我使用4个预定义常量之一,那么应用程序工作正常; 但是这些常量都提供了对我的需求来说太快的速率提示.我必须发送一个UDP数据包,其中包含每个事件更改的一些信息,并且接收端似乎完全被使用任何预定义速率的消息所淹没.使用像30000这样的整数(因为API指定以微秒为单位的数量)会导致应用程序停止一起报告传感器事件.

我错过了什么阻止我使用自己的事件率提示?

android sensor android-sensors

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

是否有一个类在Java中公开了一个无缓冲的readLine方法?

我正在清理工作中的一些代码库,其中一个较旧的类用于读写数据.该数据是US-ASCII编码的字符串和二进制编码的基元的混合.

当前实现使用DataInputStream,但正如您在文档中看到的那样,该readLine()方法已被弃用,因为与将字节转换为字符有关的问题.虽然这个编码问题并没有真正为我们提供,但是弃用是一个问题,因为它已经无法在某些版本的OpenJDK 7上运行,并且弃用意味着它可以在将来完全删除."官方"的另一种方法是使用readLineBufferedReader中,但我们不能做一个完整的换出与DataInputStream所自的BufferedReader不能真正处理的二进制编码的原语.

"混合"这两个类的问题是,当BufferedReader缓冲流时,它会使流标记前进.这意味着对readDouble()来自DataInputStream的方法的后续调用将因IOExceptions或EOFExceptions而失败,因为流标记的实际位置不是"应该"在应用程序逻辑的上下文中的位置.

我查看了某种hacky mark()/ reset()策略,但有时流是由FileInputStream支持的,它不支持mark()/ reset().

除了改变我们的数据协议以将原语写成字符或编写我自己的实现readLine()(这是令人惊讶的非平凡),有没有办法实现这一点?此时我甚至愿意考虑使用外部库.

java io readline bufferedreader datainputstream

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

使用stdlib.h或stdio.h中的某些函数会导致语法错误

我正在使用Win7 Pro x64上的Visual Studio 2005中的一些C代码.代码是正确的; 它在Eclipse下编译并在MinGW上运行.但是,使用标准C库(如stdio或stdlib)中的某些函数会导致以下行在VS2005中生成代码时出现语法错误.举个例子:

#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#include"someOtherHeader.h"

int main(void){
    srand((unsigned int) time(NULL));
    double start;
.
.
.
Run Code Online (Sandbox Code Playgroud)

以下代码无关紧要.VS2005表示缺少';' 在'类型'之前.注释掉srand()可以解决问题.奇怪的是,当稍后调用rand()时,没有问题.我还注意到exit()和fprint()的行为.但不是malloc().思考?

c syntax-error

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

Haskell性能:利用分析结果和基本调优技术(消除显式递归等)而苦苦挣扎

我在玩Haskell时花了很长一段时间,我开始重新开始.我当然还在学习语言.我已经意识到,在编写Haskell时,让我感到紧张/不舒服的一件事就是我对如何制作兼具惯用高效的算法没有很强的把握.我意识到"过早优化是所有邪恶的根源",但同样慢的代码将不得不最终处理,我只是无法摆脱我的先入为主的语言,这些语言是如此高级别的超级慢.

所以,在那种情况下,我开始玩测试用例.我正在研究的其中一个是对经典的4阶Runge-Kutta方法的天真,直接的实现,适用于相当琐碎的IVP dy/dt = -y; y(0) = 1,它给出了y = e^-t.我在Haskell和C中编写了一个完全直接的实现(稍后我将发布).Haskell的版本是令人难以置信的简洁,给了我在里面温暖的毛球,当我看着它,但C版本(这实际上是不可怕解析所有)结束了快一倍.

我意识到比较两种不同语言的表现并非百分之百; 直到我们都死C的那一天,很可能总是拥有作为表演之王的王冠,特别是手动优化的C代码.我不是试图让我的Haskell实现像我的C实现一样快.但我非常肯定,如果我更清楚自己在做什么,那么我可以从这个特定的Haskell实现中获得更高的速度.

Haskell版本是-02在OS X 10.8.4的GHC 7.6.3下编译的,C版本是用Clang编译的,我没有给它标记.跟踪时time,Haskell版本平均大约为0.016秒,而C版本大约为0.006秒.

这些时间考虑了二进制文件的整个运行时间,包括输出到stdout,这显然是一些开销的原因,但我确实通过重新编译和运行以及查看GC 对GHC二进制文件进行了一些分析.统计数据.我并没有真正理解我所看到的所有内容,但似乎我的GC并没有失控,尽管可能会受到一点点控制(5%,生产率约为93%用户,~85经过的总时间百分比)并且大部分的生产时间都花在了这个函数上,我知道这个时候写的很慢,但是对于我来说如何去清理它并不是很明显.我意识到我在使用List时可能会受到惩罚,无论是在将结果转储到stdout 的常数和懒惰中都是如此.-prof -auto-all+RTS -p+RTS -siterateRKcons

我究竟做错了什么?什么库函数或Monadic魔法我不幸地不知道我可以用来清理iterateRK?什么是学习如何成为GHC剖析摇滚明星的好资源?

RK.hs

rk4 :: (Double -> Double -> Double) -> Double -> Double -> Double -> Double
rk4 y' h t y = y + (h/6) * (k1 + 2*k2 + 2*k3 + k4)
  where k1 = y' …
Run Code Online (Sandbox Code Playgroud)

recursion performance haskell numerical-analysis

3
推荐指数
2
解决办法
253
查看次数