在Haskell中,(( - >)t)在实例的类型签名中意味着什么?例如,Functor,Applicative和Monad都有一个实例:
Functor ((->) r)
Run Code Online (Sandbox Code Playgroud)
我找不到任何关于这种类型签名的含义的解释,并且它具有高度的搜索引擎抗性.
似乎有很多聪明的事情都是用懒惰评估的语言完成的,这些例子在严格评估的环境中无法完成.例如,Haskell中的无限列表,或者用树中的最小值替换树中的每个元素.
是否有任何巧妙的事情用严格评估的语言完成的例子,用懒惰评估的语言不能轻易完成?
我正在编写一个以交互方式运行外部子进程的程序,我需要输出句柄的内容一旦可用就输出到stdout.我尝试过这样的事情:
main = do processInfo <- createProcess (proc "ghci" []){std_out = CreatePipe,
std_in = CreatePipe }
case processInfo of
(Just hIn, Just hOut, _, _) -> do mainloop hIn hOut
hClose hIn
hClose hOut
_ -> do error "Unable to start process"
mainloop :: Handle -> Handle -> IO ()
mainloop inh outh =
do ineof <- hIsEOF outh
if ineof
then return ()
else do inpStr <- hGetLine outh
putStrLn inpStr
mainloop inh outh
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为它只能逐行识别输出,因此不会显示未由换行符终止的进程输出句柄上的任何输出.我用hGetContents尝试了同样的事情,但它产生了相同的结果.我已经阅读了System.Process和System.IO的文档,并没有真正找到任何结论.
我不知道如果这是预期或错误,但在运行后(clojure.tools.namespace.repl/refresh-all)的clojure.repl命名空间丢失。
nREPL server started on port 61579 on host 127.0.0.1 nrepl://127.0.0.1:61579
REPL-y 0.3.5, nREPL 0.2.7
Clojure 1.6.0
testbed.core=> (doc map)
-------------------------
clojure.core/map
([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & colls])
Returns a lazy...
nil
testbed.core=> (require 'clojure.tools.namespace.repl)
nil
testbed.core=> (clojure.tools.namespace.repl/refresh-all)
:reloading (testbed.core testbed.core-test)
:ok
testbed.core=> (doc map)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: doc in this context, compiling:(/private/var/folders/xs/jbvb_r6j07q8xtclwlcbm21h0000gn/T/form-init6764593924445976503.clj:1:1)
testbed.core=>
Run Code Online (Sandbox Code Playgroud)
我的 project.clj 非常简单:
(defproject testbed "0.1.0-SNAPSHOT"
:description "FIXME: write description" …Run Code Online (Sandbox Code Playgroud) 我必须接管并改进/完善一些代码,将Java对象从第三方库转换为内部对象.目前,这是通过一个大的if-else语句完成的:
if (obj instanceOf X)
{
//code to initialize internal object
}
else if (obj instanceOf Y)
{
//code to initialize different object
}
else if (obj instanceOf Z)
{
//more init code
}
...
Run Code Online (Sandbox Code Playgroud)
我个人认为这个解决方案并不令人满意; 它变得冗长而混乱,更糟糕的是,许多if-else块包含更多if-else块处理子类和边缘情况.这个问题有更好的解决方案吗?