当前位置:   PHOTOSHOP > 正文

如何用任意arity函数组合`not`?

haskell,functional-programming,function,composition,编辑器,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发工具,前端开发工具,开发人员工具,站长工具

当我有类似的功能

f :: (Ord a) => a -> a -> Bool
f a b = a > b

我想用make函数包装这个函数.

例如,使这样的功能

g :: (Ord a) => a -> a -> Bool
g a b = not $ f a b

我可以像组合一样组合

n f = (\a -> \b -> not $ f a b)

但我不知道怎么做.

*Main> let n f = (\a -> \b -> not $ f a b)
n :: (t -> t1 -> Bool) -> t -> t1 -> Bool
Main> :t n f
n f :: (Ord t) => t -> t -> Bool
*Main> let g = n f
g :: () -> () -> Bool

我究竟做错了什么?

并且奖励问题我如何能够通过更多和更少的参数来实现这一功能,例如

t -> Bool
t -> t1 -> Bool
t -> t1 -> t2 -> Bool
t -> t1 -> t2 -> t3 -> Bool

luqui.. 41

除非你想要使用类型类别进行攻击,这最好留给思想实验和概念证明,否则你只是不要推广到多个参数.别试试.

至于你的主要问题,这是Conal Elliott的语义编辑器组合器最优雅的解决方案.语义编辑器组合器是一种类型如下的函数:

(a -> b) -> F(a) -> F(b)

F(x)某些表达涉及哪里x.还有"逆变"编辑器组合(b -> a)代替.直观地说,编辑器组合器选择一些较大值的一部分来操作.你需要的是result:

result = (.)

查看您尝试操作的表达式的类型:

a -> a -> Bool

这种类型的结果(值域)是a -> Bool和的结果类型Bool,这就是你想申请什么not来.所以要应用not函数结果的结果f,你写:

(result.result) not f

这美妙地概括.以下是一些组合器:

argument = flip (.)     -- contravariant

first f (a,b) = (f a, b)
second f (a,b) = (a, f b)

left f (Left x) = Left (f x)
left f (Right x) = Right x
...

所以如果你有一个x类型的值:

Int -> Either (String -> (Int, Bool)) [Int]

而且你想申请notBool,你只需要说明实现目标的途径:

(result.left.result.second) not x

哦,如果你还有Functors,你会注意到它fmap是一个编辑组合.事实上,上面的拼写可以拼写:

(fmap.left.fmap.fmap) not x

但我认为使用扩展名称更清楚.

请享用.



1> luqui..:

除非你想要使用类型类别进行攻击,这最好留给思想实验和概念证明,否则你只是不要推广到多个参数.别试试.

至于你的主要问题,这是Conal Elliott的语义编辑器组合器最优雅的解决方案.语义编辑器组合器是一种类型如下的函数:

(a -> b) -> F(a) -> F(b)

F(x)某些表达涉及哪里x.还有"逆变"编辑器组合(b -> a)代替.直观地说,编辑器组合器选择一些较大值的一部分来操作.你需要的是result:

result = (.)

查看您尝试操作的表达式的类型:

a -> a -> Bool

这种类型的结果(值域)是a -> Bool和的结果类型Bool,这就是你想申请什么not来.所以要应用not函数结果的结果f,你写:

(result.result) not f

这美妙地概括.以下是一些组合器:

argument = flip (.)     -- contravariant

first f (a,b) = (f a, b)
second f (a,b) = (a, f b)

left f (Left x) = Left (f x)
left f (Right x) = Right x
...

所以如果你有一个x类型的值:

Int -> Either (String -> (Int, Bool)) [Int]

而且你想申请notBool,你只需要说明实现目标的途径:

(result.left.result.second) not x

哦,如果你还有Functors,你会注意到它fmap是一个编辑组合.事实上,上面的拼写可以拼写:

(fmap.left.fmap.fmap) not x

但我认为使用扩展名称更清楚.

请享用.


我喜欢SEC的这种解释.有关更多信息,请参阅[博客文章](http://conal.net/blog/posts/semantic-editor-combinators/).小修正:我称"不是"是一个"编辑"和"结果","左","第二"等"编辑组合",因为它们改变了编辑的构成.

2> Norman Ramse..:

实际上,使用类型类做任意arity变得异常简单:

module Pred where

class Predicate a where
  complement :: a -> a

instance Predicate Bool where
  complement = not

instance (Predicate b) => Predicate (a -> b) where
  complement f = \a -> complement (f a)  
  -- if you want to be mysterious, then
  -- complement = (complement .)
  -- also works

ge :: Ord a => a -> a -> Bool
ge = complement (<)

谢谢你指出这个很酷的问题.我爱哈斯克尔.



3> Apocalisp..:

你的n个组合子可以写成:

n = ((not .) .)

至于你的奖金问题,典型的方法是创建其中的几个:

lift2 = (.).(.)
lift3 = (.).(.).(.)
lift4 = (.).(.).(.).(.)
lift5 = (.).(.).(.).(.).(.)

等等



4> Norman Ramse..:

回复:我做错了什么?:

我认为你的组合器很好,但是当你把它绑定在顶层时,Haskell的一个令人讨厌的"默认规则"就会发挥作用而且绑定不是一般化的:

Prelude> :ty (n f)
(n f) :: (Ord t) => t -> t -> Bool
Prelude> let g = n f
Prelude> :ty g
g :: () -> () -> Bool

我认为你可能会受到"单态限制"的影响,因为它适用于类型类.在任何情况下,如果您离开顶级循环并将事物放入具有显式类型签名的单独文件中,则一切正常:

module X where

n f = (\a -> \b -> not $ f a b)
f a b = a > b

g :: Ord a => a -> a -> Bool
g = n f

奖金问题:要使用越来越多的类型参数来做这件事,你可以尝试用类型系统玩坏血病技巧.要查阅的两篇论文是Hughes和Claessen 关于 QuickCheck的论文和Ralf Hinze撰写的论文" Geses for the Masses".

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/PHOTOSHOP/detail/15760?site
推荐阅读
  • 如何解决《如何使VisualStudio包装行为80个字符?》经验,为你挑选了5个好方法。visual-studio,c#,编辑器,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时... [详细]

  • 如何解决《从Eclipse启动JBoss》经验,为你挑选了3个好方法。eclipse,jboss,服务器,编辑器,tomcat,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳... [详细]

  • 如何解决《在C++源代码中使用Unicode》经验,为你挑选了4个好方法。c++,unicode,standards,character-encoding,编辑器,linux,windows,DevBox,在线流程图,编程,编程问答,程序员... [详细]

  • 如何解决《如何在TextMate中撤消多个单个字符?》经验,为你挑选了0个好方法。macos,plugins,textmate,editor,编辑器,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维... [详细]

  • 如何解决《一个包含规则引擎的系统是否真的成功了?》经验,为你挑选了3个好方法。rule-engine,程序员,编辑器,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发... [详细]

  • 如何解决《部署新开发的Eclipse插件》经验,为你挑选了1个好方法。eclipse-pde,eclipse-plugin,eclipse,编辑器,xml,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析... [详细]

  • 如何解决《如何在Notepad++中多行"替换文件"》经验,为你挑选了3个好方法。scintilla,notepad++,编辑器,html,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json... [详细]

  • 如何解决《如何在Javascript中忘记"等待"异步函数时发出警告?》经验,为你挑选了2个好方法。javascript,webpack,babeljs,编辑器,https,git,DevBox,在线流程图,编程,编程问... [详细]

  • 如何解决《什么是符合此条件的Windows文本编辑器》经验,为你挑选了2个好方法。windows,text-editor,编辑器,vim,emacs,程序员,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解... [详细]

  • 如何解决《创建移动编程语言》经验,为你挑选了3个好方法。programming-languages,java-me,hecl,python,ruby,lua,javascript,apache,编辑器,DevBox,在线流程图,编程,编程问... [详细]

  • 如何解决《在RStudio中保存》经验,为你挑选了1个好方法。r,rstudio,go,编辑器,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发工具,前端开发工具,开... [详细]

  • 如何解决《自动完成功能已停止在SSMS2016上工作》经验,为你挑选了1个好方法。sql-server,intellisense,autocomplete,编辑器,sql,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工... [详细]

  • 如何解决《什么是PHPFAVOR关闭PHP文件的标签?》经验,为你挑选了2个好方法。php,注入,编辑器,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发工具,前端开... [详细]

  • 如何解决《打开标准CollectionEditor中的"描述"面板》经验,为你挑选了1个好方法。.net,designer,visual-studio,编辑器,DevBox,在线流程图,编程,编程问答,程序员,开发者工具... [详细]

  • 如何解决《Redmine最佳实践》经验,为你挑选了7个好方法。project-management,redmine,svn,eclipse,ruby,iphone,git,服务器,https,go,编辑器,DevBox,在线流程图,编程,编... [详细]

  • 如何解决《使用Vim进行Lisp开发》经验,为你挑选了7个好方法。lisp,ide,vim,common-lisp,编辑器,emacs,ruby,python,php,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,... [详细]

  • 如何解决《Eclipse有一个很好的JSP编辑器吗?》经验,为你挑选了2个好方法。eclipse,jsp,eclipse-plugin,editor,编辑器,xml,go,ios,DevBox,在线流程图,编程,编程问答,程序员,开发者工具... [详细]

  • 如何解决《自动将"OptionPrivateModule"添加到VBA中的所有模块》经验,为你挑选了1个好方法。excel,vba,excel-vba,vbe,vb,编辑器,DevBox,在线流程图,编程,编程问答,程序... [详细]

  • 如何解决《使用文本区域中的代码镜像获取选定/突出显示的文本》经验,为你挑选了1个好方法。javascript,jquery,codemirror,html,编辑器,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,js... [详细]

  • 如何解决《在Julia中计算矩阵二次型的最佳方法》经验,为你挑选了1个好方法。matrix,julia,git,编辑器,emacs,https,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成... [详细]

相关标签
  

闽ICP备14008679号