2016-11-18 17 views
2

考慮:掛鉤工作在字面的短語,而不是在分配給變量

x=.4 5 6 7 
    i.# x 
0 1 2 3 

這是符合市場預期。掛鉤#作用於參數(列表4 5 6 7),返回其長度4,它又被傳遞到i.,並且打印數字0到3。

但是,如果不是我第一次分配的動詞短語的變量,然後適用於同一列表中,我得到了不同的答案:

y=.i.# 
    y x 
0 

爲什麼?

+1

這裏的問題是一些術語混淆。你的第二個例子'y = .i。#'確實是一個* hook *,並且正在運行[as * hook * s defined](http://jar.ma/1VVP95)。你的第一個例子'i。#x',不是一個鉤子,而是一個簡單的名詞短語,同時也是這樣定義的名詞短語。如果你需要'i。#x'的口頭等效語,則使用'foo =:i。@:#'注意:最好不要重新定義'x'或'y'或'u'或'v ';如果您必須,請在本地執行此操作,將其基於相同名稱的預先存在的值,並*保留nameclass *,否則您只會混淆每個人閱讀您的代碼。 –

+0

嗨@DanBron感謝您的意見。在進一步的調查中,我認爲在第二種情況下發生的事情是,正在使用一個分支,並假定'i.'的二元版本。有沒有辦法強制monadic版本,從而避免組合運算符? – Jonah

+1

不,在第二個版本中使用*鉤子*。一個* fork *由3個動詞組成,一個hook由2個動詞組成。在第二個例子中,你只有兩個動詞,''''和'#',所以你要處理的是一個鉤子。你的進一步分析是正確的:鉤子*總是*調用左動詞的二元價,無論鉤(動詞本身)是單調還是二元調用。如果你想要一個沒有連接的「i.'和'#'組合(儘管問自己」爲什麼?「),那麼你必須使用特殊情況的」capped fork「或僞叉」':「。 #'。這個用例是它的存在理由。 –

回答

3

(i. #) y是一個鉤子,而i. # y只是從右到左評估參數。 v1 v2 v3 v4 v5 y相當於v1 (v2 (v3 (v4 (v5 y))))

這裏的問題是一些術語混淆。你的第二個例子y =. i. #確實是一個掛鉤,並且正在運行as hooks are defined。你的第一個例子i. # x不是一個鉤子,而是一個簡單的名詞短語,並且也是這樣操作的名詞短語被定義。如果您需要口頭等效i. # x,則使用foo =: i. @: #

在第二個版本中,掛鉤正在使用中。 A fork由3個動詞組成,鉤子由2個動詞組成。你的第二個例子中只有2個動詞,i.#,所以你要處理的是鉤子掛鉤總是調用左動詞的二元價,無論掛鉤(動詞本身)是單調還是二元調用。

如果你想的i.#連詞少組成(儘管問自己「爲什麼?」),則必須使用特殊的情況「封頂叉」,或僞叉,[: i. #。這個用例是它的存在理由。

注意:最好不要重新定義xyuv;如果您必須,請在本地執行此操作,將其基於相同名稱的預先存在的值,並保留該名稱類,否則您只會混淆讀取代碼的所有人。

致謝:EelvexDan Bron的評論已經通過上面的粘貼和稍微編輯來回答。