x=.4 5 6 7
i.# x
0 1 2 3
這是符合市場預期。掛鉤#
作用於參數(列表4 5 6 7
),返回其長度4
,它又被傳遞到i.
,並且打印數字0到3。
但是,如果不是我第一次分配的動詞短語的變量,然後它適用於同一列表中,我得到了不同的答案:
y=.i.#
y x
0
爲什麼?
x=.4 5 6 7
i.# x
0 1 2 3
這是符合市場預期。掛鉤#
作用於參數(列表4 5 6 7
),返回其長度4
,它又被傳遞到i.
,並且打印數字0到3。
但是,如果不是我第一次分配的動詞短語的變量,然後它適用於同一列表中,我得到了不同的答案:
y=.i.#
y x
0
爲什麼?
(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. #
。這個用例是它的存在理由。
注意:最好不要重新定義x
或y
或u
或v
;如果您必須,請在本地執行此操作,將其基於相同名稱的預先存在的值,並保留該名稱類,否則您只會混淆讀取代碼的所有人。
這裏的問題是一些術語混淆。你的第二個例子'y = .i。#'確實是一個* hook *,並且正在運行[as * hook * s defined](http://jar.ma/1VVP95)。你的第一個例子'i。#x',不是一個鉤子,而是一個簡單的名詞短語,同時也是這樣定義的名詞短語。如果你需要'i。#x'的口頭等效語,則使用'foo =:i。@:#'注意:最好不要重新定義'x'或'y'或'u'或'v ';如果您必須,請在本地執行此操作,將其基於相同名稱的預先存在的值,並*保留nameclass *,否則您只會混淆每個人閱讀您的代碼。 –
嗨@DanBron感謝您的意見。在進一步的調查中,我認爲在第二種情況下發生的事情是,正在使用一個分支,並假定'i.'的二元版本。有沒有辦法強制monadic版本,從而避免組合運算符? – Jonah
不,在第二個版本中使用*鉤子*。一個* fork *由3個動詞組成,一個hook由2個動詞組成。在第二個例子中,你只有兩個動詞,''''和'#',所以你要處理的是一個鉤子。你的進一步分析是正確的:鉤子*總是*調用左動詞的二元價,無論鉤(動詞本身)是單調還是二元調用。如果你想要一個沒有連接的「i.'和'#'組合(儘管問自己」爲什麼?「),那麼你必須使用特殊情況的」capped fork「或僞叉」':「。 #'。這個用例是它的存在理由。 –