我在函数式编程和PLT圈子中多次听到过"enggebras"这个术语,特别是在讨论对象,comonads,镜头等时.谷歌搜索这个术语给出了对这些结构进行数学描述的页面,这对我来说几乎是不可理解的.任何人都可以解释一下代数在编程环境中的意义,它们的意义是什么,以及它们与对象和共同体的关系?
haskell functional-programming scala category-theory recursion-schemes
我对Haskell并不十分精通,所以这可能是一个非常简单的问题.
Rank2Types解决了什么语言限制?Haskell中的函数是否已经支持多态参数?
许多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 …
当看着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比上述更有说服力的包装使用示例?
我已经阅读了几篇关于Java 8即将推出的Optional类型的帖子,我试图理解为什么人们一直认为它不像Scala的Option那么强大.据我所知,它有:
我错过了什么?
计算a的深度需要什么最小(最一般)的信息Data.Tree?是一个Data.Foldable足够的实例?
我起初试图fold一个Tree和被困试图找到合适的Monoid相似Max.有些东西告诉我,因为Monoid(这会计算深度)需要是关联的,它可能不能用于表达需要了解结构的任何折叠(如1 + maxChildrenDepth),但我不确定.
我想知道什么样的思维过程会让我在这种情况下得到正确的抽象.
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)
也就是说,操作二进制关联函数的折叠(因此应用顺序无关紧要).如果我没记错的话,这在数据库中很常见,因为它可以并行化.所以,关于它,我问:
我写了以下逻辑表达式求值器.它适用于简单的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 中一般树的深度。我可以找出简单二叉树的解决方案,但不能找出具有任意数量叶子的一般树。
这是我的二叉树代码。
--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) haskell ×9
fold ×2
scala ×2
tree ×2
types ×2
catamorphism ×1
function ×1
java ×1
monoids ×1
polymorphism ×1