小编win*_*zki的帖子

仿函数的这个属性比单子强吗?

在思考如何推广monad时,我想出了一个仿函数F的以下属性:

inject :: (a -> F b) -> F(a -> b) 
Run Code Online (Sandbox Code Playgroud)

- 这应该是a和b中的自然变换.

如果没有更好的名称,如果存在上面显示的自然变换,我将函数F称为可绑定inject.

主要问题是,这个属性是否已经知道并且有一个名称,它是如何与仿函数的其他众所周知的属性相关的(例如,应用,monadic,尖头,可遍历等)

名称"可绑定"的动机来自以下考虑:假设M是monad而F是"可绑定"仿函数.然后有一个具有以下自然态射:

fbind :: M a -> (a -> F(M b)) -> F(M b)
Run Code Online (Sandbox Code Playgroud)

这类似于monadic"bind",

bind :: M a -> (a -> M b) -> M b
Run Code Online (Sandbox Code Playgroud)

除了结果用仿函数F装饰.

背后的想法fbind是,广义的monadic操作不仅可以产生单个结果M b,而且可以产生这种结果的"函数"F.我想表达一个monadic操作产生几个"计算线"而不仅仅是一个的情况; 每个"计算链"再次成为一元计算.

注意,每个仿函数F都具有态射

eject :: F(a -> b) -> a -> F b
Run Code Online (Sandbox Code Playgroud)

这与"注入"相反.但并非每个仿函数F都有"注入".

具有"注入"的仿函数的示例:F t = (t,t,t) 或者F t = c -> (t,t)其中c是常量类型.F t = cFunctor(常量仿函数)或 …

monads haskell functional-programming functor category-theory

19
推荐指数
2
解决办法
675
查看次数

没有monad变换器的monad的明确示例是什么?

Monad变换器以所有标准monad(Reader,Writer,State,Cont,List等)而闻名,但这些monad变换器中的每一个都以稍微不同的方式工作.在给定具有monad实例的类型构造函数的定义的情况下,没有用于构造monad变换器的通用方法或公式.因此,不能保证根据某些任意业务要求设计的monad数据类型将具有monad变换器.有没有这样一个明确的例子?

相关工作

另一个问题解释了两个monad的仿函数组合不一定是monad.另见这个问题.这些例子没有回答当前的问题 - 它们仅仅说明了没有构造单子变压器的一般方法的问题.这些例子表明,给定两个单子M和N,我们有时会发现M(N a)是单子,有时N(M a)是单子,有时也不是单子.但这既没有说明如何为M或N构造monad变换器,也没有表明它是否存在.

另一个问题的答案认为,IO单子不能有一个单子转换,因为如果它有一个IOT,我们可以申请IOTList,然后抬起空列表(lift [])到生成的单子就必须撤消副作用的进行"早期" IO monad.这个论点是基于IOmonad"实际上执行"可能无法撤消的副作用的想法.但是,IOmonad不是显式类型构造函数.

讨论

在明确给出monad类型的每个例子中,可以以某种方式找到monad变换器, - 有时需要一定的独创性.例如,最近发现ListT存在于Haskell库中的变换器以微妙的方式发生错误,但最终通过更改定义来解决问题.ListT

没有变换器的monad的标准示例是monad,例如IO,实际上不是由显式类型构造函数定义的 - IO是库以某种方式在低级别定义的不透明"魔术"类型.很明显,无法IO纯函数赋予monad实例定义为显式类型构造函数.该IO示例显示,如果我们允许monad实例包含具有不纯副作用的隐藏低级代码,则monad转换器可能无法存在.所以,让我们将注意力限制在使用纯函数实现的monad上.

似乎没有一种算法可以从monad的源代码中自动导出monad变换器.我们甚至知道这总是可能的吗?

为了让我更清楚一个monad的"明确例子"我的意思:假设我声称

 type Q u v a = ((u -> (a, Maybe a)) -> v) -> u -> (a, Maybe a)
Run Code Online (Sandbox Code Playgroud)

可以有一个合法的Monad实例相对于所述类型参数 …

monads haskell functional-programming monad-transformers

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

如何在iOS5和iOS6上修复有缺陷的webkit-text-size-adjust?

-webkit-text-size-adjust在iOS 5和iOS 6下的UIWebView中使用CSS属性时,我得到的线条高度不正确.在iOS 5和iOS 6中似乎存在一个错误,但行为不同,我正在尝试修复演示文稿它适用于所有IOS版本.

我想要实现的目标:我将以下HTML代码加载到UIWebView中.代码仅设置所有文本的字体大小,行高和文本大小调整.

 <html><head>
 <style language="text/css">
 body {
 -webkit-text-size-adjust : 50%;
 }
 p {
   font-size: 2em;
   line-height: 3em;
  /* line-height: 150%; */  
 }
 </style>
 </head><body>
 <p>Text text text... </p>
 </body>
Run Code Online (Sandbox Code Playgroud)

属性的50%值-webkit-text-size-adjust应减少(减去50%)整个文本的大小.这是有道理的,以减少双方的字体大小,并在同一时间线上的高度,否则文本看起来很丑陋.现在,似乎iOS 5.1和iOS 6都没有这样做.(在我的应用程序中,我必须使用该属性,-webkit-text-size-adjust因为用户应该能够更改文本大小.)

iOS 5.1的行为是减小字体大小; 线高保持相同的值.所以iOS 5.1会像我写的那样解释上面的HTML font-size: 1em; line-height: 3em;.iOS 5.1上的UIWebView将显示小文本,行之间有巨大的间隙.

iOS 5.1的解决方案是写line-height: 150%;而不是line-height: 3em.然后iOS 5.1保持line-height值不变为150%,而字体大小减少.因此文本显示是正确的.

的iOS 6.0的行为,从我的测试以下,是为了减少双方的字体大小和行高值, -即使行高值在给定的百分比.(这似乎是一个错误.)因此,iOS 6.0将显示此文本,就像我写的一样font-size: 1em; line-height: 75%;.结果是行高被计算为字体大小的75%,即文本行非常接近,它们几乎重叠.

iOS 6.0上的解决方案是编写line-height: …

css webview ios

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

如何在停用设备管理员时擦除Android设备?

在我的应用程序(设备管理员)中,当用户尝试停用应用程序的管理功能时,我需要擦除整个设备.当用户转到设置/安全/设备管理员并停用管理员应用程序时,首先会出现一个对话框"是否要取消激活".如果用户说"是",则会显示另一个小对话框,其中文本由应用程序的AdminReceiver在onDisableRequested()中提供.如果用户然后说"是",我想擦除整个设备.怎么做到这一点?

我尝试了一切,长期寻找答案,找不到真正的解决方案.

我尝试了什么:

  • AdminReceiver具有onDisable()函数.我试图在该功能中擦除设备.但是,似乎在禁用管理员调用onDisable().因此,应用程序根本无法使用wipeData()函数(抛出安全性异常).我还验证了isAdminActive()在那时返回false.

官方文档没有明确说明,但似乎在调用onDisable()时管理员已被禁用.因此,我们必须在此之前擦除设备.

  • AdminReceiver有一个函数onDisableRequested(),它返回CharSequence.我试图在该功能中添加另一个警报框.这会崩溃,因为无法从非活动上下文调用警报框,这似乎是我们在onDisableRequested()时所拥有的.

  • AdminReceiver有一个onReceive()函数,可以在任何事件上调用它.在这个函数中,我们不再处于活动上下文中,也不能呈现我们自己的对话框.

  • 我尝试从onReceive()创建另一个活动.这有效; 在onReceive()期间,当我们获得ACTION_DISABLE_ADMIN_REQUESTED时,管理员仍处于活动状态,我们可以擦除设备.但是,系统仍会显示自己的对话框,询问用户是否停用管理员.如果用户对我们的对话框拒绝但对系统对话框拒绝,则管理员将被停用,我们将无法擦除设备.

我在DeviceAdminReceiver的子类中尝试了以下内容:

@Override
public void onReceive(Context context, Intent intent) {
 // detect whether disabling is requested?
 if (intent.getAction().equals(ACTION_DEVICE_ADMIN_DISABLE_REQUESTED)) {
            confirmWipeDevice(context);

 } else {
    super.onReceive(context, intent);
 }      
}
Run Code Online (Sandbox Code Playgroud)

换句话说,如果操作是禁用管理员,我不会调用super.onReceive().函数confirmWipeDevice()使用对话框显示不同的活动.这不显示用于确认禁用我的管理员应用程序的系统对话框.但是,这并不妨碍应用程序实际被禁用!

似乎Android系统执行以下操作:

  • 将ACTION_DEVICE_ADMIN_DISABLE_REQUESTED发送到AdminReceiver

  • 无论管理员应用程序想要执行什么操作,都要禁用管理员

  • 如果用户取消禁用,则罚款; 如果没有,该应用程序被禁用.应用无法拒绝被禁用,也无法在禁用时执行设备擦除.

到目前为止,唯一的解决方案是在用户想要禁用管理应用时立即擦除而不进行确认.换句话说,我可以在onDisableRequested()中立即调用getManager().wipeData().那时,管理员仍然活跃,这是有效的.

它是否正确?当用户选择禁用管理应用程序时如何擦除设备?

android admin

11
推荐指数
2
解决办法
5669
查看次数

是否存在非恒等单子态射 M ~&gt; M 在 M 中是单子自然的?

众所周知,带有类型签名的自然变换a -> a必须是恒等函数。这遵循米田引理,但也可以直接导出。这个问题要求相同的性质,但要求 monad 态射而不是自然变换。

考虑 monadM ~> N之间的monad 态射。(这些是M a -> N a保留两边 monad 操作的自然变换。这些变换是 monad 范畴中的态射。)我们可以问是否存在e :: (Monad m) => m a -> m a对每个 monad 都以相同方式工作的 monad 态射m。换句话说,monad 态射e在 monad 类型参数中必须是单子自然的m

单子自然性定律说,对于任意两个单子 M 和 N 之间的任何单子态射 f: M a -> N a,我们必须有 f . e = e . f合适的类型参数。

问题是,我们能否证明任何这样e的函数都必须是恒等函数,或者是否有e定义为的非恒等单子态射的反例

  e :: (Monad m) => m a -> …
Run Code Online (Sandbox Code Playgroud)

monads haskell category-theory

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

为什么在使用类类型时OCAML对象中的未绑定类型变量不会出现?

我想了解OCAML对象的这种行为的原因.假设我有一个类A调用另一个类的对象的方法B.示意性地,A#f调用B#g和B#h.OOP中的常规做法是我希望避免将B用作固定的具体类,而是仅为B声明一个接口.在OCAML中执行此操作的最佳方法是什么?我尝试了几个选项,我不太明白为什么有些选项有效,有些则没有.这是代码示例.

版本1:

 # class classA = object
    method f b = b#g + b#h 
   end ;;
 Error: Some type variables are unbound in this type:
     class a : object method f : < g : int; h : int; .. > -> int end
   The method f has type (< g : int; h : int; .. > as 'a) -> int where 'a
   is unbound
Run Code Online (Sandbox Code Playgroud)

这种行为是众所周知的:OCAML正确地推断出b具有开放对象类型<g:int;h:int;..>但后来抱怨我的类没有声明任何类型变量.如此看来,classA需要有类型变量; 然后我明确地介绍了一个类型变量. …

oop ocaml

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

可以简化 Maybe 上的 Co密度 monad 吗?

类型构造函数上的代码密度 monadf定义如下:

\n
 newtype C f a = C { unC \xe2\x88\xb7 forall r. (a \xe2\x86\x92 f r) \xe2\x86\x92 f r }\n
Run Code Online (Sandbox Code Playgroud)\n

众所周知,它C f是任何类型构造函数的 monad f(不一定是协变的)。代码密度单子有多种用途,但它是一种复杂的类型,包含通用类型量词下的高阶函数。

\n

我的问题是,什么f可以证明C f相当于一个没有类型量词定义的更简单的 monad?

\n

一些可以简化的示例:

\n
    \n
  • f a = a(恒等函子),其中C f a = a.

    \n
  • \n
  • f a = r -> a(Reader monad),它C f是 State monad ( C f a = r -> (a, r))。 …

monads continuations haskell category-theory dependent-type

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