如何强制对一元动词进行分组?

时间:2015-03-05 08:23:24

标签: j

我脑子里想出了一个不正确的J动词,它会在一个字符串中找到多余字母的比例。我从一堆未定义优先级的动词开始,并尝试向内分组:

   c=. 'cool' NB. The test data string, 1/4 is redundant.
   box =. 5!:2 NB. The verb to show the structure of another verb in a box.
   p=.%#~.%# NB. First attempt. Meant to read "inverse of (tally of unique divided by tally)".
   box < 'p'
┌─┬─┬────────┐
│%│#│┌──┬─┬─┐│
│ │ ││~.│%│#││
│ │ │└──┴─┴─┘│
└─┴─┴────────┘
   p2=.%(#~.%#) NB. The first tally is meant to be in there with the nub sieve, so paren everything after the inverse monad.
   box < 'p2'
┌─┬────────────┐
│%│┌─┬────────┐│
│ ││#│┌──┬─┬─┐││
│ ││ ││~.│%│#│││
│ ││ │└──┴─┴─┘││
│ │└─┴────────┘│
└─┴────────────┘
   p3=. %((#~.)%#) NB. The first tally is still not grouped with the nub sieve, so paren the two together directly. 
   box < 'p3'
┌─┬────────────┐
│%│┌──────┬─┬─┐│
│ ││┌─┬──┐│%│#││
│ │││#│~.││ │ ││
│ ││└─┴──┘│ │ ││
│ │└──────┴─┴─┘│
└─┴────────────┘
   p3 c  NB. Looks about right, so test it!
|length error: p3
|       p3 c
   (#~.)c  NB. Unexpected error, but I guessed as to what part had the problem.
|length error
|       (#~.)c

我的问题是,为什么我的分组方法会因此长度错误而失败,我应该如何对其进行分组以获得所需的效果? (我认为这与把它变成钩子而不是分组有关,或者它只是没有意识到它需要使用monad形式,但我不知道如何验证或绕过它。)

1 个答案:

答案 0 :(得分:2)

Forkcompose

(# ~.)hook。这可能是你没想到的。 (# ~.) 'cool'正在将~.应用于'cool',以便为您提供'col'。但是因为它是一个monadic钩子,它然后尝试'cool' # 'col',这不是你想要的,并且它给出了长度错误。

要将0.25作为字符串中冗余字符的比例,请不要使用倒数(%)。您只需从1中减去唯一字符的比例。这对叉子非常简单:

   (1 - #&~. % #) 'cool'
0.25
   p9 =. 1 - #&~. % #
   box < 'p9'
┌─┬─┬──────────────┐
│1│-│┌────────┬─┬─┐│
│ │ ││┌─┬─┬──┐│%│#││
│ │ │││#│&│~.││ │ ││
│ │ ││└─┴─┴──┘│ │ ││
│ │ │└────────┴─┴─┘│
└─┴─┴──────────────┘

撰写(&)确保您将小块(#)统一起来(~.),以便叉子将其作为单个动词抓取。 fork是一系列三个动词,它们应用第一个和第三个动词,然后将中间动词应用于结果。因此#&~. % #是分叉,其中#&~.应用于字符串,从而生成3。已应用#,结果为4。然后将%应用于这些结果,3 % 4,为您提供0.75。这是我们独特角色的比例。

1 -只是为了让我们0.25而不是0.75% 0.751 % 0.75相同,后者为您1.33333