我试图了解结果
(*) . (+)
Run Code Online (Sandbox Code Playgroud)
在哈斯克尔.我知道合成算子只是数学函数的标准组成 - 所以
(f . g) = f (g x)
Run Code Online (Sandbox Code Playgroud)
但:
(*) . (+) :: (Num (a -> a), Num a) => a -> (a -> a) -> a -> a
Run Code Online (Sandbox Code Playgroud)
我很难理解这种类型的签名.我希望能够做到这样的事情:
((*) . (+)) 1 2 :: Num a => a -> a
= (* (+ 1 2))
Run Code Online (Sandbox Code Playgroud)
的意义是什么 (*) .(+)的签名?我尝试用它来玩它(只是匹配它的签名):
((*) . (+)) 1 (\x -> x + 1) 1
Run Code Online (Sandbox Code Playgroud)
但那无法编译.我正在尝试在编写这些步骤时完成逻辑步骤,但我还没有完全理解它是如何得到这个结果的(以及结果是什么).
Lisp中的同质性很容易看出:
(+ 1 2)
既是函数调用+与1,2作为参数,以及作为含有一个列表+,1和2.它同时是代码和数据.
但是,像朱莉娅这样的语言:
1 + 2
我知道我们可以Expr在Julia中将其解析为:
:(1 + 2)
然后我们可以获得AST并操纵它:
julia> Meta.show_sexpr(:(1+2))
(:call, :+, 1, 2)
因此,我们可以在Julia(和Elixir)中操纵程序的AST.但它们是否与Lisp一样具有同音性 - 任何代码片段实际上只是语言本身的数据结构吗?
我不知道1 + 2Julia中的代码是如何立即像(+ 1 2)Lisp中的数据一样只是一个列表.它仍然是杀人的吗?
我试图更好地理解Haskell的懒惰,例如当它评估函数的参数时.
从这个来源:
但是当一个调用
const被评估时(这就是我们感兴趣的情况,毕竟这里),它的返回值也被评估......这是一个很好的一般原则:一个函数显然在其返回值上是严格的,因为当需要对函数应用程序进行求值,它需要在函数体中评估返回的内容.从那里开始,您可以通过查看返回值总是依赖于什么来了解必须评估的内容.你的函数在这些参数中是严格的,在其他参数中是懒惰的.
那么Haskell中的函数总是评估自己的返回值?如果我有:
foo :: Num a => [a] -> [a]
foo [] = []
foo (_:xs) = map (* 2) xs
head (foo [1..]) -- = 4
Run Code Online (Sandbox Code Playgroud)
根据以上段落map (* 2) xs,必须进行评估.直觉上,我认为这意味着应用于map整个列表 - 导致无限循环.但是,我可以成功地取得结果.我知道:在Haskell 中是懒惰的,所以这是否意味着评估map (* 2) xs只意味着构建尚未完全评估的其他东西?
评估应用于无限列表的函数意味着什么?如果在评估函数时总是评估函数的返回值,函数是否可以实际返回thunk?
编辑:
bar x y = x
var = bar (product [1..]) 1
Run Code Online (Sandbox Code Playgroud)
此代码不会挂起.当我创造时var,它不会评估它的身体吗?或者它设定bar到product [1..],而不是评价是什么?如果后者bar没有在WHNF中恢复它的身体,那么它真的"评估"x吗?如果它不依赖于计算,怎么可能bar是严格的?xproduct [1..]
当遵循风暴启动器回购中的指南时,我无法实际运行任何拓扑 - 就像ExclamationTopology.
mvn clean install -DskipTests=true成功运行,从顶级Storm回复执行,就像mvn package在storm-examples关卡一样.
当我尝试运行时storm jar target/storm-starter-2.0.0-SNAPSHOT.jar org.apache.storm.starter.ExclamationTopology,我收到错误:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/storm/topology/IRichSpout
Run Code Online (Sandbox Code Playgroud)
我正在运行OS X,Java版本:
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
Run Code Online (Sandbox Code Playgroud)
Maven版本3.3.9.
有没有人对我为什么会收到此错误以及我的设置中应该更改的内容有任何想法?
完整错误输出:
Running:
/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bin/java -client -Ddaemon.name= -Dstorm.options= -Dstorm.home=/Users/zachary/apache-storm-0.10.0 -Dstorm.log.dir=/Users/zachary/apache-storm-0.10.0/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /Users/zachary/apache-storm-0.10.0/lib/asm-4.0.jar:/Users/zachary/apache-storm-0.10.0/lib/clojure-1.6.0.jar:/Users/zachary/apache-storm-0.10.0/lib/disruptor-2.10.4.jar:/Users/zachary/apache-storm-0.10.0/lib/hadoop-auth-2.4.0.jar:/Users/zachary/apache-storm-0.10.0/lib/kryo-2.21.jar:/Users/zachary/apache-storm-0.10.0/lib/log4j-api-2.1.jar:/Users/zachary/apache-storm-0.10.0/lib/log4j-core-2.1.jar:/Users/zachary/apache-storm-0.10.0/lib/log4j-over-slf4j-1.6.6.jar:/Users/zachary/apache-storm-0.10.0/lib/log4j-slf4j-impl-2.1.jar:/Users/zachary/apache-storm-0.10.0/lib/minlog-1.2.jar:/Users/zachary/apache-storm-0.10.0/lib/reflectasm-1.07-shaded.jar:/Users/zachary/apache-storm-0.10.0/lib/servlet-api-2.5.jar:/Users/zachary/apache-storm-0.10.0/lib/slf4j-api-1.7.7.jar:/Users/zachary/apache-storm-0.10.0/lib/storm-core-0.10.0.jar:target/storm-starter-2.0.0-SNAPSHOT.jar:/Users/zachary/apache-storm-0.10.0/conf:/Users/zachary/apache-storm-0.10.0/bin -Dstorm.jar=target/storm-starter-2.0.0-SNAPSHOT.jar org.apache.storm.starter.ExclamationTopology
Error: A …Run Code Online (Sandbox Code Playgroud) 我是Haskell的新手,我正在尝试编写一个带有列表并返回bool的函数.
True如果其输入列表是'a'仅包含的列表,则返回,False否则返回.
这是我最好的猜测:
f :: [a] -> Bool
f ('a':[]) = True
f (x:xs) = False
Run Code Online (Sandbox Code Playgroud)
这无法编译并返回:
Couldn't match type `a' with `Char'
`a' is a rigid type variable bound by
the type signature for f :: [a] -> Bool at charf.hs:6:1
In the pattern: 'b'
In the pattern: 'b' : []
In an equation for `f': f ('b' : []) = True
Run Code Online (Sandbox Code Playgroud)
我的逻辑错误是什么?
为了我自己的理解,我想在Haskell中定义一个带有两个参数的函数 - 无论是整数还是两个Chars.它对参数做了一些微不足道的检查,如下:
foo 1 2 = 1
foo 2 1 = 0
foo 'a' 'b' = -1
foo _ _ = -10
Run Code Online (Sandbox Code Playgroud)
我知道这不会编译,因为它不知道它的args是Num还是Char类型.但我无法使其论证具有多态性,例如:
foo :: a -> a -> Int
Run Code Online (Sandbox Code Playgroud)
因为那时我们说它必须是身体中的Char(或Int).
是否可以在Haskell中执行此操作?我想过可能会创建一个自定义类型?就像是:
data Bar = Int | Char
foo :: Bar -> Bar -> Int
Run Code Online (Sandbox Code Playgroud)
但我认为这也不合适.一般来说,我很困惑Haskell中的函数是明确的ONE类型,还是类型类的多态,是否禁止在函数体中使用特定类型.
我一直致力于在Haskell中理解foldlvs foldrvs.foldl'我理解,共识是在第二个参数中使用foldr何时f是惰性的,因为它反映了列表的结构.foldl'当我们知道需要处理整个列表并且f其参数严格时,会更好.
我特别感兴趣的是这样的情况:
foldr (&&) False (repeat False)
Run Code Online (Sandbox Code Playgroud)
回报False.
但:
foldl (&&) False (repeat False)
Run Code Online (Sandbox Code Playgroud)
从未完成.
该foldr扩展为:
False && (False && (False && .... (False && *False*)) ... )
Run Code Online (Sandbox Code Playgroud)
鉴于foldl:
&& (... (&& (&& *False* False) False) ...) False
Run Code Online (Sandbox Code Playgroud)
星星是False传入的基础案例fold.
是否foldr能立即终止,因为LHS只是一个单一的False,而foldl单False是在右边一路,它不"检查"直到它完成处理左边?
我在做这个之前检查了这篇文章,但那篇文章并没有真正解释为什么这不起作用.
foo :: (Num a, Show a) => a -> IO ()
foo 0 = print "Was zero"
foo x = print x
foo 2 -- prints 2
foo 5 -- prints 5
map foo [0..10] :: [IO ()] -- Doesn't print out numbers.
Run Code Online (Sandbox Code Playgroud)
编辑:
bar 0 = foo 0
bar n = do
foo n
bar (n - 1)
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这会返回[IO ()],但我不明白为什么在构建这个名单不会发生打印.至少,我希望我们会看到第一次打印调用是因为懒惰的评估.
在创建此列表的过程中,为什么不会出现打印到屏幕的"副作用"?foo应用于列表的每个元素时,是否实际未输入该函数?如果print评估调用以获得IO ()构建列表,为什么副作用不会发生?
如果我在Haskell中有一个单独的链表:
data LL a = Empty | Node a (LL a) deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)
我可以轻松地实现在结尾和开头插入的方法.但是在特定元素之后或之前插入呢?如果我有一个LL的Integer,我可以在Haskell区分之间插入4含有特定的节点之后1,而不是第一个1,它处理列表时看到的?
Node 1 (Node 2 (Node 3 (Node 1 Empty)))
Run Code Online (Sandbox Code Playgroud)
我很好奇一个insertAfter方法看起来如何能够指定"在包含1的特定节点之后插入5".如果我想在第一个节点包含之后插入1,我是否必须传入整个列表来指定它,并且仅针对最后一个节点Node 1 Empty?
我不确定将此作为"对象相等"来解决是否正确 - 但我想知道是否有一种方法可以在这样的数据结构中引用具有相同有效负载的类型的特定元素.
我有一个GenServer通过连接到远程TCP连接的gen_tcp。
opts = [:binary, active: true, packet: :line]
{:ok, socket} = :gen_tcp.connect('remote-url', 8000, opts}
我正在处理以下消息:
def handle_info({:tcp, socket, msg}, stage) do
IO.inspect msg
{:noreply, state}
end
哪个很棒。但是,TCP服务器容易超时。如果使用gen_tcp.recv,则可以指定超时。但是,我使用active: true来接收消息handle_info,而不必遍历和调用recv。因此,GenServer即使服务器已超时,也愉快地等待下一条消息。
GenServer如果X秒后仍未从TCP连接接收到消息,该如何触发函数?我会坚持使用recv吗?
在Python中,我们可以做到:
'a' * 4
Run Code Online (Sandbox Code Playgroud)
得到'aaaa'.
我们做不到:
'a' + 4
Run Code Online (Sandbox Code Playgroud)
我们首先必须将4转换为字符串.
这只是一个任意选择,使用String和Int arg的定义重载*,并且不为String和Int重载+?
我试图理解这是如何适应Python被认为是'强类型',如果我们将其定义为不执行任何隐式类型转换的语言,例如它在上面的例子中没有将4转换为字符串.那么在第一个例子中,这是运算符重载的一个例子,而不是隐式转换?
在文档中,我找不到mul或*的定义,它采用Int和String,只有2个Int的形式.我们如何知道存在重载定义?