我想我已经大致了解了免费monad是什么,但我想有一个更好的方式来形象化它.
有意义的是,自由岩浆只是二叉树,因为它可以像你一样"一般"而不会丢失任何信息.
同样,有意义的是,免费幺半群只是列表,因为操作顺序无关紧要.现在在"二叉树"中存在冗余,因此如果有意义的话,您可以将其展平.
有意义的是,自由群体看起来像分形,出于类似的原因:https://en.wikipedia.org/wiki/Cayley_graph#/media/File: Cayley_graph_of_F2.svg 并且为了得到其他群体,我们只是识别不同的元素该群体是"相同的",我们得到其他群体.
我应该如何形象化免费的monad?现在,我只是把它想象成你能想象的最通用的抽象语法树.这本质上是吗?还是我过度简化了?
同样,从免费monad到列表或其他monad,我们会失去什么?我们认为什么是"相同"?
我感谢所有能够阐明这一点的评论.谢谢!
这是我一段时间以来一直困惑的事情,我不知道如何能够更多地了解它.假设我有以下程序:
main :: IO ()
main = do
x <- liftM read getLine
y <- liftM read getLine
print (x % y)
Run Code Online (Sandbox Code Playgroud)
如果我运行这个与输入6
和2
,它将打印3 % 1
.
在什么时候简化发生(即由gcd划分)?是在实施show
吗?如果是这样,那么理性的基本表征仍然存在6 % 2
吗?如果没有,那么确实(%)
做了简化吗?我的印象(%)
是数据构造函数,那么数据构造函数除了"构造"之外还会做什么呢?更重要的是,我将如何实际使用自己的数据构造函数进行类似的操作?
我感谢任何关于这个主题的帮助.
镜头库中是否有这样的快捷方式?
\x -> liftM (^. x) get
Run Code Online (Sandbox Code Playgroud)
也许这是一个愚蠢的问题,但它感觉就像一个基本的结构,应该有一个捷径.
昨晚,我正在编写一些娱乐代码,并且在某些时候我更换了一个concatMap
,>>=
并且在我的代码中看到了大约10%的加速.
我的印象是对于>>=
for 的定义[]
是完全正确的concatMap
,所以我有点困惑.
所以我使用了aeson库,并认为拥有以下功能非常有用:
v .:! f = liftM (fromMaybe mempty) (v .:? f)
Run Code Online (Sandbox Code Playgroud)
当我问GHCi的类型时,我得到:
(.:!)
:: (Monoid r, FromJSON r) =>
Object
-> T.Text -> aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser r
Run Code Online (Sandbox Code Playgroud)
然而,解析器本身实际上并不无论是出口Data.Aeson
还是Data.Aeson.Types
.我被迫没有为我定义的功能设置类型签名吗?
或者,如果有人知道更好的方式来完成我想要做的事情,我会对你的建议感兴趣.
我从https://github.com/bitc/hdevtools/在线查看了说明,我仍然看到以下内容:
Syntastic: active mode enabled
Syntastic info for filetype: haskell
Available checker(s):
Currently enabled checker(s):
Run Code Online (Sandbox Code Playgroud)
我找不到谷歌的任何东西.我做错了什么/仍然需要做才能让它发挥作用?
我正在为一个类定义一个构造函数,我有这两个定义:
MyClass(Set<ClassA> setOfA) { ... }
MyClass(Set<ClassB> setOfB) { ... }
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
MyClass(java.util.Set<ClassA>) is already defined in MyClass
MyClass(Set<ClassB> setOfB)
Run Code Online (Sandbox Code Playgroud)
如果我特意将其中一个设为HashSet而不是Set,则代码会编译.为什么?
省略函数参数是简洁的Haskell代码的一个很好的工具.
h :: String -> Int
h = (4 +) . length
Run Code Online (Sandbox Code Playgroud)
如何在case语句中省略数据构造函数参数.下面的代码可能被认为有点蹩脚,其中s
和i
是最后的参数A
,B
但是作为每个案例匹配的主体中的最终参数重复.
f :: Foo -> Int
f = \case
A s -> 4 + length s
B i -> 2 + id i
Run Code Online (Sandbox Code Playgroud)
有没有办法在案例模式匹配中省略这些参数?对于具有大量参数的构造函数,这将从根本上缩短代码宽度.例如以下伪代码.
g :: Foo -> Int
g = \case
{- match `A` constructor -> function application to A's arguments -}
A -> (4 +) . length
{- match `B` constructor -> function application to B's arguments -} …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用更新版本的JaCoCo插件,并且当我想要gradle dependencies
运行0.7.1.201405082137
时,运行会向我显示它正在运行的版本0.7.5.201505241946
.
知道如何做到这一点或者是否有新版JaCoCo的插件可用?
谢谢!
我有以下代码:
import java.util.*;
class A {
int x;
A() { x = 0; }
A(int t) { x = t; }
public int hashCode() { return x; }
public boolean equals(A that) { return x == that.x; }
}
class Test {
static HashMap<A, Integer> stuff;
public static void main(String[] args) {
stuff = new HashMap<A,Integer>();
A a = new A(1);
stuff.put(a, 100);
System.out.println(stuff.get(a).toString());
System.out.println(stuff.get(new A(1)).toString());
}
}
Run Code Online (Sandbox Code Playgroud)
为什么第二个印刷声明给我一个NullPointerException
?
haskell ×7
ghc ×3
java ×2
aeson ×1
constructor ×1
free-monad ×1
gradle ×1
hashmap ×1
haskell-lens ×1
jacoco ×1
list ×1
monads ×1
performance ×1
syntastic ×1
type-erasure ×1