我已经看到很多函数是根据模式定义的(f .) . g.例如:
countWhere = (length .) . filter
duplicate = (concat .) . replicate
concatMap = (concat .) . map
Run Code Online (Sandbox Code Playgroud)
这是什么意思?
haskell functional-programming pointfree function-composition tacit-programming
通过动词,副词,叉子等编写J风格的超级浓缩默契编程,是否曾经通过图书馆尝试主流功能语言?
如果是这样,结果有多成功?
如果没有,是否有技术问题使这不可能,或者它是否值得做?
我特别感兴趣的是像forks这样的结构似乎与函数式编程中的基本概念没有直接对应.
我目前正在学习迷人的J编程语言,但有一点我无法弄清楚如何过滤列表.
假设我有任意列表3 2 2 7 7 2 9,我想删除2s,但保持其他一切不变,即我的结果将是3 7 7 9.我怎么做到这一点?
是否可以在Lisp中使用/实现默认编程(也称为无点编程)?如果答案是肯定的,它已经完成了吗?
假设我有一个mean如此定义的函数:
mean xs = sum xs / (fromIntegral $ length xs)
Run Code Online (Sandbox Code Playgroud)
但我想以某种默契形式,像这样:
mean = sum / (fromIntegral . length)
Run Code Online (Sandbox Code Playgroud)
是否有内置的Haskell方法可以在这些行中执行某些操作而无需构建自己的tacit函数(类似这样):
tacit :: (a -> b -> c) -> (d -> a) -> (d -> b) -> d -> c
tacit a b c i = a (b i) (c i)
Run Code Online (Sandbox Code Playgroud)
在这种形式中,函数如下所示:
mean = tacit (/) sum (fromIntegral . length)
Run Code Online (Sandbox Code Playgroud)
但感觉可能有一种方法可以避免使用像这样的显式函数.我是在想; 是否有一些方法可以做到内置于Haskell?
我已经使用J几个月了,我发现阅读不熟悉的代码(例如我自己没有写的代码)是该语言最具挑战性的方面之一,特别是当它处于默认状态时.过了一会儿,我提出了这个策略:
1)将代码段复制到word文档中
2)从(1)中取出每个操作员并将其放在单独的一行上,使其垂直读取
3)用词汇表页面中的口头描述替换每个操作符
4)从J语法到英语语法的粗略翻译
5)使用翻译来识别与概念相关的组件,并使用换行符分隔它们
6)用普通的英文散文写出(5)中每个组成部分应该做的描述
7)基于(6)写出整个程序应该做什么的描述
8)写出为什么可以说(1)中的代码代表(7)中的设计概念的解释.
虽然我从这个过程中学到了很多东西,但我发现它相当艰巨和耗时 - 特别是如果有人使用我以前从未遇到的概念设计他们的程序.所以我想知道:J社区中的其他人是否有最喜欢的方法来找出晦涩难懂的代码?如果是这样,这些方法的优点和缺点是什么?
编辑:
我需要分解的代码类型的示例如下:
binconv =: +/@ ((|.@(2^i.@#@])) * ]) @ ((3&#.)^:_1)
Run Code Online (Sandbox Code Playgroud)
我自己写了这个,所以我碰巧知道它需要一个数字输入,将它重新解释为一个三元数组,并将结果解释为base-2中一个数字的表示,最多只有一个重复.(例如,binconv 5 =(3 ^ 1)+ 2*(3 ^ 0) - > 1 2 - >(2 ^ 1)+ 2*(2 ^ 0)= 4.)但如果我偶然发现它没有任何先前的历史或文件,弄清楚这是它的作用将是一个非常重要的练习.
我知道所有3个都是相关的,我已经看到了用J编写的Project Euler中的问题的几个答案,以及一些写的K.我想知道的是,你建议学习哪个,你会建议去哪里关于获取材料学习它?
我一直在学习Factor和J语言来试验无点编程.这些语言的基本机制似乎很清楚,但是如何理解如何进行算法设计是一项挑战.
对我来说,一个特殊的混淆源是如何构造代码以便很容易地尝试不同的参数.通过这个,我的意思是Mathematica和Matlab如此擅长的事情; 你设置了一个算法然后操纵变量并观察发生了什么.
没有显式变量,你怎么做?也许我在想这一切都错了.我应该如何在无点编程中实现这一点?
functional-programming j pointfree tacit-programming factor-lang
我发现'addons/math/misc/brent.ijs'将布伦特的方法作为副词实现.我想建立一个牛顿方法作为副词,但它比构建默认动词要困难得多.
这是牛顿迭代的显式版本:
newton_i =: 1 : '] - u % u d.1'
Run Code Online (Sandbox Code Playgroud)
有了这样的用法:
2&o. newton_i^:_ (1) NB. (-: 1p1) must be found
1.5708
2 o. 1.5708 NB. after substitution we get almost 0
_3.67321e_6
Run Code Online (Sandbox Code Playgroud)
当然,为方便起见:
newton =: 1 : 'u newton_i^:_'
Run Code Online (Sandbox Code Playgroud)
什么是默认的等价物?
j ×6
haskell ×3
pointfree ×3
apl ×1
combinators ×1
common-lisp ×1
composition ×1
f# ×1
factor-lang ×1
function ×1
k ×1
lambda ×1
lisp ×1
operators ×1