小编Emi*_*mil的帖子

可视化免费Monad

我想我已经大致了解了免费monad是什么,但我想有一个更好的方式来形象化它.

有意义的是,自由岩浆只是二叉树,因为它可以像你一样"一般"而不会丢失任何信息.

同样,有意义的是,免费幺半群只是列表,因为操作顺序无关紧要.现在在"二叉树"中存在冗余,因此如果有意义的话,您可以将其展平.

有意义的是,自由群体看起来像分形,出于类似的原因:https://en.wikipedia.org/wiki/Cayley_graph#/media/File: Cayley_graph_of_F2.svg 并且为了得到其他群体,我们只是识别不同的元素该群体是"相同的",我们得到其他群体.

我应该如何形象化免费的monad?现在,我只是把它想象成你能想象的最通用的抽象语法树.这本质上是吗?还是我过度简化了?

同样,从免费monad到列表或其他monad,我们会失去什么?我们认为什么是"相同"?

我感谢所有能够阐明这一点的评论.谢谢!

monads haskell free-monad

19
推荐指数
1
解决办法
1734
查看次数

如何在Haskell中实现Ratio?

这是我一段时间以来一直困惑的事情,我不知道如何能够更多地了解它.假设我有以下程序:

main :: IO ()
main = do
    x <- liftM read getLine
    y <- liftM read getLine
    print (x % y)
Run Code Online (Sandbox Code Playgroud)

如果我运行这个与输入62,它将打印3 % 1.

在什么时候简化发生(即由gcd划分)?是在实施show吗?如果是这样,那么理性的基本表征仍然存在6 % 2吗?如果没有,那么确实(%)做了简化吗?我的印象(%)是数据构造函数,那么数据构造函数除了"构造"之外还会做什么呢?更重要的是,我将如何实际使用自己的数据构造函数进行类似的操作?

我感谢任何关于这个主题的帮助.

haskell

15
推荐指数
2
解决办法
1046
查看次数

在Lens中有这样的捷径吗?

镜头库中是否有这样的快捷方式?

\x -> liftM (^. x) get
Run Code Online (Sandbox Code Playgroud)

也许这是一个愚蠢的问题,但它感觉就像一个基本的结构,应该有一个捷径.

haskell haskell-lens

11
推荐指数
1
解决办法
285
查看次数

当它们应该是同一个东西时,为什么>> =比concatMap更快?

昨晚,我正在编写一些娱乐代码,并且在某些时候我更换了一个concatMap,>>=并且在我的代码中看到了大约10%的加速.

我的印象是对于>>=for 的定义[]是完全正确的concatMap,所以我有点困惑.

performance haskell list ghc

11
推荐指数
1
解决办法
140
查看次数

类型签名需要一个未由库导出的类型

所以我使用了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.我被迫没有为我定义的功能设置类型签名吗?

或者,如果有人知道更好的方式来完成我想要做的事情,我会对你的建议感兴趣.

haskell ghc aeson

8
推荐指数
1
解决办法
114
查看次数

合成和hdevtools

我从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)

我找不到谷歌的任何东西.我做错了什么/仍然需要做才能让它发挥作用?

haskell ghc syntastic

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

为什么我不能在Java中为单个类定义这两个构造函数?

我正在为一个类定义一个构造函数,我有这两个定义:

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,则代码会编译.为什么?

java constructor type-erasure

4
推荐指数
2
解决办法
65
查看次数

在Haskell case语句中省略构造函数参数

省略函数参数是简洁的Haskell代码的一个很好的工具.

h :: String -> Int
h = (4 +) . length
Run Code Online (Sandbox Code Playgroud)

如何在case语句中省略数据构造函数参数.下面的代码可能被认为有点蹩脚,其中si是最后的参数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)

haskell

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

如何应用不同版本的Gradle插件?

我正在尝试使用更新版本的JaCoCo插件,并且当我想要gradle dependencies运行0.7.1.201405082137时,运行会向我显示它正在运行的版本0.7.5.201505241946.

知道如何做到这一点或者是否有新版JaCoCo的插件可用?

谢谢!

gradle jacoco gradle-plugin

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

自定义类不能用作HashMap键

我有以下代码:

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

java hashmap

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