在阅读类型类时,我已经看到Functors,Applicative Functors和Monads之间的关系是严格增加的权力.函数是可以映射的类型.Applicative Functors可以使用某些效果执行相同的操作.Monads与可能不受限制的效果相同.此外:
Every Monad is an Applicative Functor
Every Applicative Functor is a Functor
Run Code Online (Sandbox Code Playgroud)
Applicative Functor的定义清楚地表明了这一点:
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
但Monad的定义是:
class Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
m …Run Code Online (Sandbox Code Playgroud) 我想知道Erlang OTP dict模块是否实现为哈希表,在这种情况下它是否提供了这样的性能?
平均情况
Search: O(1 + n/k)
Insert: O(1)
Delete: O(1 + n/k)
Run Code Online (Sandbox Code Playgroud)
最糟糕的情况
Search: O(n)
Insert: O(1)
Delete: O(n)
Run Code Online (Sandbox Code Playgroud)
来源:维基百科哈希表
给定如下的矩阵,将其转换为90度,进入下面的第二个矩阵.你会如何以最干净的方式做到这一点?简洁/简洁/清晰的解决方案,其中易于掌握的点是优选的.
从
[[A1,A2,A3],
[B1,B2,B3],
[C1,C2,C3]]
Run Code Online (Sandbox Code Playgroud)
至
[[A1,B1,C1],
[A2,B2,C2],
[A3,B3,C3]]
Run Code Online (Sandbox Code Playgroud)
编辑:我意识到原始问题并不清楚.我想知道如何在Erlang中做到这一点.
我有这种格式的约会{Y,M,D}.是否有任何良好的支持库或我可以使用的技巧,简单地说,从这个日期减去三个月而不会遇到无效日期,闰年等问题.
我最近的类似用法是在MySql中你可以输入:
Select '2011-05-31' - Interval 3 Month;
Run Code Online (Sandbox Code Playgroud)
产量'2011-02-28'.我对如何自己编写这个库不感兴趣,这是我想避免的.
Haskell具有sum函数
sum :: Num a => [a] -> a
Run Code Online (Sandbox Code Playgroud)
哪个可以很好地组合以对矩阵求和
sum . map sum :: Num a => [[a]] -> a
Run Code Online (Sandbox Code Playgroud)
然而,更深入,例如求和立方体,会产生限制Num [a]
sum . map sum . map sum :: (Num a, Num [a]) => [[[a]]] -> a
Run Code Online (Sandbox Code Playgroud)
如果你考虑一下,这很自然.因此,前者试图定义一个人脸上的sumcube函数,我们需要找到一条不同的路径.其中一种尝试是:
sum . map sum . map (map sum) :: Num a => [[[a]]] -> a
Run Code Online (Sandbox Code Playgroud)
这似乎与汇总函数一样自然.
在我寻求在Haskell中使用解决问题的心理工具的过程中,我有兴趣知道如何解决这个问题,即通过堆叠map sums 来总结任何深度的结构,就像在我的第三个代码示例中一样.这是可能吗?在那种情况下,你会怎么做?
我经常发现自己想要将常规函数插入"绑定"序列中.就像在这个人为的例子中一样:
getLine >>= lift (map toUpper) >>= putStrLn
Run Code Online (Sandbox Code Playgroud)
我需要定义提升功能lift :: (a -> b) -> a -> m b才能使其工作.问题是我不知道这样的功能,而Hoogle似乎也没有.我觉得这很奇怪,因为这对我来说很有意义.
现在,可能有其他方法可以使这项工作,但我喜欢无点样式代码允许我在一个通道中扫描线以找出正在发生的事情的方式.
let lift f x = return (f x) in
getLine >>= lift (map toUpper) >>= putStrLn
Run Code Online (Sandbox Code Playgroud)
我的问题归结为:我错过了什么或者怎么没有像升力机这样的功能.我在Haskell的经历仍然非常有限,所以我假设大多数人以不同的方式解决这个问题.有人可以向我解释解决这个问题的惯用方法.
我喜欢在REPL中玩,因为它是一种尝试新事物的快速而简单的方法.如您所知,该语言的某些方面在REPL中与在模块内完成不同,多行定义就是其中之一.
现在,我想知道是否,在这种情况下,我可以在REPL中声明操作符固定性.天真的尝试......惊喜......不起作用.
Prelude> let (f · g) x = f(g(x))
Prelude> infixl 7 ·
Run Code Online (Sandbox Code Playgroud) 给定一个功能:
min(A, B) when A =< B -> A;
min(_A, B) -> B.
Run Code Online (Sandbox Code Playgroud)
我可以在函数foldl中以与此类似的方式使用它:
lists:foldl(fun min/2, 0, [1,2,3,4,5,6,7,8,9,10])
Run Code Online (Sandbox Code Playgroud)
我认为这是不可能的,因为我必须设置一个初始值,该值将与列表的其余部分进行比较,例如,我没有想到的身份函数.我对吗?
语法是用Erlang编写的,但对于非Erlang程序员来说也应该是可读的.
erlang functional-programming list fold higher-order-functions
我想构建一个带有类型签名的函数Time t => t -> Bool.当在文档看Data.Time有一些上下班几种不同的类型,如:UTCTime,LocalTime,和ZonedTime,但我觉得没有类型类这些系统整合起来.有没有这样的或者我应该把时间当作一个Num?(即连续统一体)