在Haskell中,class Monad声明为:
class Applicative m => Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
return = pure
Run Code Online (Sandbox Code Playgroud)
我怎样才能证明Monadis实际上Applicative是这样声明的?
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
具体来说,我怎么能写pure并<*>在以下方面return和>>=?
我怎样才能证明Monadis实际上Functor是这样声明的?
class Functor f where
fmap …Run Code Online (Sandbox Code Playgroud) 在Haskell Monad中声明为
class Applicative m => Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
return = pure
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以将bind运算符重新声明为
(>>=) :: (a -> m b) -> m a -> m b
Run Code Online (Sandbox Code Playgroud)
?
第二个声明使将(>>=)type a -> m b的函数映射到type 的函数m a -> m b更清晰,而原始的声明却使它的含义更不清楚,是否正确?
声明的更改是否会使某些事情变为可能,甚至是不可能,或者只需要对使用monad进行一些更改(Haskell程序员似乎可以接受)?
谢谢。
https://zh.m.wikibooks.org/wiki/Haskell/Category_theory说
join :: Monad m => m (m a) -> m a
join x = x >>= id
Run Code Online (Sandbox Code Playgroud)
是id 在类的身份函子Hask和也id有型a-> a?
>>=要求它的第二个参数具有type a->ma,如果id具有type a-> a,怎么可以id用作...的第二个参数>>=?
return具有类型a -> ma。是join和return彼此相反吗?
谢谢。
好的,所以我有一些看起来像这样的东西:
[Just [["Value1"],["","",""]],Just [["Value2"],["","","","","","","","","","","","","","","","","","","","","","","","","","","Value3",""]],Just [["Value4","",""]],Just [["Value5"],["","",""]],Just [["Value6"],["","",""]],Just []]
Run Code Online (Sandbox Code Playgroud)
我需要将所有这些值写入LaTeX文件,忽略空字符串(可能成对,每对一行).
我该怎么做呢?
谢谢
编辑:我的文件应如下所示:
Value1 Value2
Value3 Value4
Value5 Value6
Run Code Online (Sandbox Code Playgroud) 相关的问题是
在第一个问题中:
Monads 有什么特别之处?
monad 是一种数学结构,在(纯)函数式编程中大量使用,基本上是 Haskell。但是,还有许多其他数学结构可用,例如应用函子、强单子或幺半群。有些更具体,有些更通用。然而,单子更受欢迎。这是为什么?
回答问题的评论:
在我的记忆中,monads 是由 Wadler 普及的,当时没有繁琐的 CPS 进行 IO 和没有显式状态传递的解析的想法是巨大的卖点;这是一个非常激动人心的时刻。AFAIR,Haskell 没有做构造函数类,但是 Gofer(Hugs 之父)做了。Wadler 建议为 monad 重载列表理解,所以后来出现了 do 符号。一旦 IO 成为 monadic,monads 就成为初学者的大事,将它们巩固为一个重要的东西。Applicative 在你可以的时候更好,Arrows 更通用,但它们来得较晚,而且 IO 很难卖 monad。– AndrewC 2013 年 5 月 9 日 1:34
@Conal 的回答是:
我怀疑对这一特定类型类 (
Monad) 的过多关注主要是历史上的侥幸。人们经常将 与 联系IO起来Monad,尽管这两个是独立有用的想法(列表反转和香蕉也是如此)。因为IO是神奇的(有实现但没有外延)并且Monad通常与 相关联IO,所以很容易陷入神奇的思考中Monad。
首先,我同意他们的观点,我认为Monads的用处主要来自Functors,我们可以在结构中嵌入许多函数,而Monads是通过join …
哪个在实践中更好?有可选列表或列表中有可选项吗?
目前我正在关注一个可选列表.
列出[选项[T]]或选项[列表[T]]?
编辑:
我遇到的问题是我有crud操作,我正在返回可选类型.我有一种情况,我有一个方法,只进行一次查找,我想利用它来创建一个返回列表的函数.我仍然在用scala弄湿我的脚,所以我很好奇最佳做法是什么.
例:
def findOne(id: Int): Option[T]
Run Code Online (Sandbox Code Playgroud)
无论实现我想用它来做这样的事情,但哪个更好?它们似乎都很奇怪.也许我总是缺少一些东西:
def find(ids: List[Int]) : Option[List[T]]
Run Code Online (Sandbox Code Playgroud)
VS
def find(ids: List[Int]) : List[Option[T]]
Run Code Online (Sandbox Code Playgroud) 我查看过去的讨论,但无法理解为什么任何答案都是正确的.
合用的
<*> :: f (a -> b) -> f a -> f b
单子
(>>=) :: m a -> (a -> m b) -> m b
因此,如果我做对了,那么声称是>>=不能仅仅假设存在而写的<*>
好吧,让我们假设我有<*>.
我想创造>>=.
所以我有f a.
我有f (a -> b).
现在当你看它时,f (a -> b)可以写成(a -> b)(如果某个东西是x,y,z的函数 - 那么它也是x,y的函数).
所以从<*>我们得到的存在(a -> b) -> f a -> f b再次可以写成((a -> b) -> f a) …
为什么我会写这样的东西:
main :: IO ()
main = getLine >>= putStrLn
Run Code Online (Sandbox Code Playgroud)
从那以后getLine :: IO String,putStrLn :: String -> IO String似乎这个行动的整体类型应该是IO String.为什么编译而不是给出类型错误?我能想出的唯一原因是在编译时>> return ()添加到值的末尾main.那么这里发生了什么?
类别理论中的Monads由三元组T,单位,平坦 defined定义.
class Monad t where
map :: (a -> b) -> (t a -> t b) -- functorial action
unit :: a -> t a
flat :: t (t a) -> t a
class KleisliTriple t where
unit :: a -> t a
flatMap :: t a -> (a -> t b) -> t b
Run Code Online (Sandbox Code Playgroud)
KleisliTriple由运营商展示结构:( flatMap或bind在Haskell中)由map和的组成flat.
但是,我总是认为在函数式编程中理解和实现Monad概念更加简单和容易,通过将结构与对象(例如flatUnit,unit和的组合)展平来构成函数flat.
在这种情况下,flatUnit(flatUnit(x)) = flatUnit(x).我实际上是用这种方式在JavaScript中实现的,并且使用flatUnit和 …
javascript monads haskell functional-programming category-theory
monads ×10
haskell ×9
javascript ×2
applicative ×1
file-writing ×1
functor ×1
latex ×1
optional ×1
scala ×1
types ×1