在定义时分配反函数

Assigning an inverse function at definition time

我写了一个小玩具十六进制转换器;我有编码和解码功能:

encode16 =: { & '0123456789ABCDEF' @ ((6 $ 16) & #:)
decode16 =: (16 & #.) @ ('0123456789ABCDEF' & i.)

我希望它们互为反函数,这样我就可以编写代码并看到如下内容:

   119&+ &. decode16 '03A8D8'
03A94F

我的第一个猜测是添加这个:

encode16 =: encode16 :. decode16

这会产生递归,所以我决定改为:

encode16basic =: { & '0123456789ABCDEF' @ ((6 $ 16) & #:)
decode16basic =: (16 & #.) @ ('0123456789ABCDEF' & i.)

encode16 =: encode16basic :. decode16basic
decode16 =: decode16basic :. encode16basic

这是处理反函数的典型方式吗?人们通常会在定义时分配反函数吗?是否真的有必要将逆函数分配给编码和解码函数?似乎是这样,因为文档没有另外说明。

定义它们的一个选项可能是:

   encode16=: ({&'0123456789ABCDEF'@((6)&#:)) :. ((16&#.)@('0123456789ABCDEF'&i.))
   decode16=: encode16^:_1

   119&+&.decode16 '03A8D8'
03A94F

您可以按如下方式检查动词的正面:

   decode16 b. _1
encode16
   encode16 b. _1
16&#.@('0123456789ABCDEF'&i.) :.({&'0123456789ABCDEF'@(16 16 16 16 16 16&#:))

查看 wiki page for Obverse 了解更多详情。