2015-03-05 6 views
1

Я придумал неправильный 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 

Моим вопрос, почему мой подход к группировке потерпеть неудачу с этой ошибкой длиной, и как я должен сгруппировал его, чтобы получить желаемый эффект? (Я предполагаю, что это как-то связано с превращением его в крючок вместо группировки, или просто не понимая, что ему нужно использовать формы монады, но я не знаю, как это проверить или обойти, если это так).

ответ

2

Fork и compose.

(# ~.) является hook. Вероятно, это то, чего вы не ожидаете. (# ~.) 'cool' применяет ~. к 'cool', чтобы дать вам 'col'. Но поскольку он является монадическим крюком, он затем пытается 'cool' # 'col', что не то, что вы намереваетесь, и которое дает ошибку длины.

Чтобы получить 0.25 как отношение избыточных символов в строке, не используйте обратную (%). Вы просто вычтите из 1 отношение уникальных персонажей. Это довольно просто с вилкой:

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

Compose (&) гарантирует, что вы Талли (#) гвоздем (~.) вместе, так что вилка захватывает его в качестве одного глагола. Вилка представляет собой серию из трех глаголов, которая применяет первый и третий глагол, а затем применяет средний глагол к результатам. Таким образом, #&~. % # является вилкой, где #&~. применяется к строке, в результате чего 3. #, в результате чего 4. И затем к этим результатам добавляется %, так как 3 % 4, что дает вам 0.75. Это наше отношение уникальных персонажей.

1 - только для нас 0.25 вместо 0.75. % 0.75 - это то же самое, что и 1 % 0.75, что дает вам 1.33333.

+1

Обычно я использую @ вместо & при работе с монадическими глаголами, потому что они имеют тот же эффект и что у них есть и для связывания существительных с глаголами. Тем не менее, я использовал и в диадическом виде через крючок в этом решении. -. @ (% ~ & # ~.) 'cool' и использование -. вместо 1- – bob

+0

Я должен был понять, что мне нужен дополнительный, а не обратный. Кроме того, ваше решение, датчанин, является лояльным переводом моего первоначального мышления: 1 - # & ~.% # Может быть прочитано «один минус единственного числа, деленного на счет». И @bob, я считаю, что ваше решение ~. @ (% ~ & # ~.) Можно было бы прочитать: «дополнение к разделению нечетких уникальных и уникальных». Правильно ли я понимаю оба значения? – dukereg

+1

Со своей стороны ваша интерпретация верна. Я также понял, что вчера вечером вы могли получить ответ, который ближе к дробному формату, чем десятичный float, применяя х: глагол к результату. x: @ -. @ (% ~ & # ~.) 'cool' приводит к 1r4, который является рациональным выражением в J для 0.25. Надеюсь, что это полезно. – bob