- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个关于 value in context 的小问题。
取 Just 'a'
,所以在这种情况下 Maybe
类型上下文中的值是 'a'
采用[3]
,因此在这种情况下,[a]
类型上下文中的值为3
如果像这样为 [3]
应用 monad:[3] >>=\x -> [x+3]
,它意味着您将值 3
分配给 x
。没关系。
但是现在,采用[3,2]
,那么[a]
类型的上下文中的值是多少?。奇怪的是,如果你像这样为它应用 monad:
[3,4] >>= \x -> x+3
它得到了正确的答案 [6,7]
,但实际上我们不明白在这种情况下 x 是什么。你可以回答,啊 x 是 3 然后是 4,并且 x 将函数提供 2 次并像 Monad
那样进行连接:concat (map f xs)
像这样:
[3,4] >>= concat (map f x)
所以在这种情况下,[3,4]
将被分配给 x。这意味着错误,因为 [3,4]
不是一个值。 Monad
是错误的。
最佳答案
我认为您的问题是过于关注值(value)观。 monad 是一种类型构造函数,因此不关心值的数量和类型,而仅上下文。
A Maybe a
可以是 a
,也可以什么都不是。很简单,您正确地观察到了这一点。
一个 Either String a
要么是一些 a
,要么是一些 String
形式的信息(例如,为什么计算 >a
失败)。
最后,[a]
是未知数量的 a
(或者根本没有),这可能是由于计算不明确,或者一个给出了多个结果(就像一个二次方程)。
现在,对于 (>>=)
的解释,了解 monad 的基本属性(类别理论家如何定义它)是有帮助的
join :: m (m a) -> m a.
与fmap
一起,(>>=)
可以用join
来写。
join
的含义如下:一个上下文,再次放入相同的上下文,仍然具有相同的结果行为(对于这个 monad)。
这对于 Maybe(Maybe a)
来说非常明显:Something 本质上可以是 Just (Just x)
,或者 Nothing
,或者 Just Nothing
,它提供与 Nothing
相同的信息。因此,不用Maybe (Maybe a)
,您可以只使用Maybe a
,这样您就不会丢失任何信息。这就是 join
所做的:它转换为“更简单”的上下文。
[[a]]
在某种程度上更难,但并不多。您基本上从多个/模棱两可的结果中得到多个/模棱两可的结果。一个很好的例子是四次多项式的根,它是通过求解二次方程得到的。您首先得到两个解决方案,然后从每个解决方案中找到另外两个解决方案,从而得到四个根。
但重点是,你说的是模棱两可的模棱两可的结果,还是只是模棱两可的结果,都没有关系。您可以始终使用“模棱两可”的上下文,并使用 join
转换多个级别。
这就是 (>>=)
对列表所做的事情:它将不明确的函数应用于不明确的值:
squareRoots :: Complex -> [Complex]
fourthRoots num = squareRoots num >>= squareRoots
可以重写为
fourthRoots num = join $ squareRoots `fmap` (squareRoots num)
-- [1,-1,i,-i] <- [[1,-1],[i,-i]] <- [1,-1] <- 1
因为您所要做的就是为每个可能的值找到所有可能的结果。
这就是为什么 join
是列表的 concat
,事实上
m >>= f == join (fmap f) m
必须包含在任何 monad 中。
可以对IO
给出类似的解释。有副作用的计算,也可能有副作用 (IO (IO a)
),本质上只是有副作用的东西。
关于haskell - 关于上下文中的值(应用于 Monad),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13532048/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!