我无法理解函数应用程序如何与haskell中的currying一起工作.如果我有以下功能:
($) :: (a -> b) -> a -> b
Run Code Online (Sandbox Code Playgroud)
我明白要部分应用这个功能,我需要提供(a -> b)
函数($
第一个参数).
为什么可以先应用一个值(即反向参数)?
($ 0) :: Num a => (a -> b) -> b
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
haskell operators partial-application dollar-sign operator-sections
什么是无边表达的潜在替代表示(例如使用箭头,镜头,Haskell习语,做语法),这些表达式可以更像简单的英语?
这是一个简单的例子:
qNameIs :: String -> QName -> Bool
qNameIs = (. qName) . (==)
Run Code Online (Sandbox Code Playgroud)
QName
来自的记录 Text.Xml
什么可能相当于qNameIs
但不是有意义的表达?理想情况下,那些会显示第一个参数将被传递给(==)
结果的结果将被评估,结果qName
应用于该表达式的第二个参数?
Guava README说@Beta
或者已经弃用了可以更改,删除等等.它没有说清楚所有剩余的类是否与以前的版本二进制兼容(或者我误读了它).虽然我没有另外说明,但我觉得它是向后兼容的.
我担心的是,其他一些库可能会对新的番石榴版本起作用(并编译).但它也可能依赖于新版本可能已更改/修复的一些错误行为,这些行为无法轻易检测到.我可以安全升级吗?
请帮我理解以下定义:
newtype Writer w a = Writer { runWriter :: (a,w) }
instance (Monoid w) => Monad (Writer w) where
return a = Writer (a,mempty)
(Writer (a,w)) >>= f = let (a',w') = runWriter $ f a in Writer (a',w `mappend` w')
Run Code Online (Sandbox Code Playgroud)
为什么runWriter被声明为
runWriter :: (a,w)
Run Code Online (Sandbox Code Playgroud)
当它的实际类型是:
runWriter :: Writer w a -> (a, w)
Run Code Online (Sandbox Code Playgroud)
一旦我尝试使用ghci,我意识到这必须是一些隐含的参数,因为必须确定类型"a",但这里究竟发生了什么?
虽然许多人称赞不变性,但我发现在主流编程中难以维持.根据我的经验,程序员迟早会使字段再次变异,以避免重构大部分代码,这些代码必须传递更新的对象以及返回值.
Scala对复制构造函数有一些支持,但我知道没有令人满意的解决方案来更新复杂的对象结构.我可能错过了什么.
我实验过的最好的实现是Haskell中的数据镜头.但是,Haskell很难学.流行的跨平台编程语言(如Java或Scala)有哪些选择?
f . g $ 3
与3 g f
面向堆栈的语言相比,Haskell语法需要相对嘈杂.这个选择的主要设计论点是什么?
假设我维护连接到外部系统的复杂应用程序.有一天它开始为某些输入返回意外结果,我需要找出原因.它可能是DNS问题,filesytem相关问题,外部系统更改,任何事情.
假设处理量很大,在我能够识别问题的可能位置之前,我需要获得原始应用程序不会产生的详细跟踪.
如何检测现有代码,以便我(例如)可以提供某些组件或功能存在错误的非易失性证明(不是实时调试会话).
在更大的应用程序中,通常有多层IO缓存(Hibernate L1和L2,Spring缓存等),这些层通常是抽象的,因此调用者不需要知道特定的实现是否有IO.通过一些警告(范围,事务),它允许组件之间更简单的接口.
例如,如果组件A需要查询数据库,则无需知道结果是否已缓存.它可能是由B或C检索的,A对此一无所知,但他们通常会参与某些会话或交易 - 通常是隐含的.
框架倾向于使用像AOP这样的技术使这个调用与简单的对象方法调用无法区分.
Haskell应用程序可以像这样受益吗?客户端的界面如何?
如何在没有互联网连接的情况下浏览Haskell源代码?现在我点击hackage搜索结果,点击源链接并搜索源页面.有两个问题:
通常,IDE允许您下载任何库的源代码并打开带有定义的新编辑器选项卡.我更喜欢阅读代码而不是文档,一路上没有意外,我可以从中学到一些东西.
那么,如何在必要时使用Haskell工具或标准GNU工具设置递归源搜索?我现在所知道的是,我可以为vim生成ctags但是cabal存储来源在哪里?
我正在寻找Haskell中ExecutorService.invokeAll的等效功能.我需要实现它吗?来自文档:
执行给定的任务,返回完成所有状态和结果的Futures列表.
在我的用例中,任务花费大部分时间等待IO,所以我只需要避免不断地阻塞主线程,这会产生一系列Either
结果或错误.