相关疑难解决方法(0)

"编程代码"在编程环境中意味着什么?

我在函数式编程和PLT圈子中多次听到过"enggebras"这个术语,特别是在讨论对象,comonads,镜头等时.谷歌搜索这个术语给出了对这些结构进行数学描述的页面,这对我来说几乎是不可理解的.任何人都可以解释一下代数在编程环境中的意义,它们的意义是什么,以及它们与对象和共同体的关系?

haskell functional-programming scala category-theory recursion-schemes

334
推荐指数
4
解决办法
3万
查看次数

Rank2Types的目的是什么?

我对Haskell并不十分精通,所以这可能是一个非常简单的问题.

Rank2Types解决了什么语言限制?Haskell中的函数是否已经支持多态参数?

polymorphism haskell types higher-rank-types

106
推荐指数
5
解决办法
1万
查看次数

对于非常规递归类型,catamorphism(fold)的类型是什么?

许多catamorphisms似乎很简单,大多数用自定义函数替换每个数据构造函数,例如

data Bool = False | True
foldBool :: r              -- False constructor
         -> r              -- True constructor
         -> Bool -> r

data Maybe a = Nothing | Just a
foldMaybe :: b             -- Nothing constructor
          -> (a -> b)      -- Just constructor
          -> Maybe a -> b

data List a = Empty | Cons a (List a)
foldList :: b              -- Empty constructor
         -> (a -> b -> b)  -- Cons constructor
         -> List a -> b
Run Code Online (Sandbox Code Playgroud)

但是,对我来说不清楚的是,如果使用相同类型的构造函数,但使用不同的类型参数会发生什么.例如,而不是传递List …

haskell types catamorphism recursion-schemes

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

`Data.Monoid`中所有newtype包装器的实用价值是什么?

当看着Data.Monoid,我看到有不同的newtype包装,例如All,Sum或者Product,编码各种类群的.然而,当试图使用这些包装时,我不禁想知道使用这些包装器的好处是什么Data.Monoid.例如,比较相当繁琐的总和

print $ getSum $ mconcat [ Sum 33, Sum 2, Sum 55 ]
Run Code Online (Sandbox Code Playgroud)

与更简洁的惯用变体相比

print $ sum [ 33, 2, 55 ]
Run Code Online (Sandbox Code Playgroud)

但重点是什么?所有这些newtype包装纸都有实用价值吗?是否有Monoid newtype比上述更有说服力的包装使用示例?

haskell monoids

16
推荐指数
3
解决办法
2010
查看次数

Java 8的Optional,Scala的选项和Haskell的Maybe之间的主要区别是什么?

我已经阅读了几篇关于Java 8即将推出的Optional类型的帖子,我试图理解为什么人们一直认为它不像Scala的Option那么强大.据我所知,它有:

  • 高阶函数,如使用Java 8 lambda的map和filter.
  • Monadic flatMap
  • 通过getOrElse类型函数短路.

我错过了什么?

java haskell scala

12
推荐指数
2
解决办法
1710
查看次数

用折叠之类的东西计算树深度的最常用方法是什么?

计算a的深度需要什么最小(最一般)的信息Data.Tree?是一个Data.Foldable足够的实例?

我起初试图fold一个Tree和被困试图找到合适的Monoid相似Max.有些东西告诉我,因为Monoid(这会计算深度)需要是关联的,它可能不能用于表达需要了解结构的任何折叠(如1 + maxChildrenDepth),但我不确定.

我想知道什么样的思维过程会让我在这种情况下得到正确的抽象.

tree haskell fold

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

没有折叠的折叠有什么特性?

Foldl和folr是FP和Haskell的两个非常重要的函数,但是我从来没有听过太多关于unsided fold的内容:

fold f [a,b,c,d] = (f (f a b) (f c d))
Run Code Online (Sandbox Code Playgroud)

也就是说,操作二进制关联函数的折叠(因此应用顺序无关紧要).如果我没记错的话,这在数据库中很常见,因为它可以并行化.所以,关于它,我问:

  1. 像折叠一样,它是普遍的吗?
  2. 像foldr一样,你能用它定义每个重要的功能吗?
  3. 是否有融合规则,类似于foldr/build和unfoldr/destroy?
  4. 为什么几乎没有提到?
  5. 还有什么值得一提的考虑?

haskell functional-programming function fold

5
推荐指数
2
解决办法
212
查看次数

逻辑表达式评估器Haskell

我写了以下逻辑表达式求值器.它适用于简单的2成员表达式,并且它会运行,但会为包含其他表达式的表达式产生错误,作为第二个/第一个成员.这是我的代码.

data Expression = Literal Bool | Operation Operator Expression Expression
data Operator = AND | OR

eval :: Expression -> Bool
eval (Literal x)                    = x
eval (Operation AND (Literal x) (Literal y))
 | x == True && y == True           = True
 | otherwise                        = False
eval (Operation OR (Literal x) (Literal y))
 | x == False && y == False         = False
 | otherwise                        = True
Run Code Online (Sandbox Code Playgroud)

使用此输入调用时,它可以正常工作:

main = do
print $ eval (Operation OR (Literal False) …
Run Code Online (Sandbox Code Playgroud)

haskell

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

树的深度(哈斯克尔)

我试图弄清楚如何计算 Haskell 中一般树的深度。我可以找出简单二叉树的解决方案,但不能找出具有任意数量叶子的一般树。

这是我的二叉树代码。

--depth of a binary tree.

depth :: Tree a -> Int
depth Nil            = 0
depth (Node n x1 x2) = 1 + max (depth x1) (depth x2)
Run Code Online (Sandbox Code Playgroud)

我如何修改一般树的这个?普通树包含一个树列表,这就是我遇到困难的地方。

其次,我想把树变成一个列表(这样我就可以进行计算总和等操作)

同样,我可以计算出二叉树的值,但不能计算出一般树的值。

--tree into a list.

treeToList:: Tree a -> [a]
treeToList Nil = []
treeToList (Node n x1 x2)
         = collapse x1 ++ [n] ++ collapse x2
Run Code Online (Sandbox Code Playgroud)

tree haskell

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