сопоставление с образцом в чистых функциях

Мне нужно определить чистую функцию, которая принимает два аргумента и возвращает их частное. Если делитель равен 0, я хочу вернуть 0.

Если бы у меня была именованная функция, я бы сделал

div[_, 0]   := 0
div[x_, y_] := x / y

как сделать такое же сопоставление шаблонов для аргументов в чистой функции #1 / #2 &?




Ответы (3)


Switch может быть полезно, например:

Switch[ # ,
       _String , StringLength[#] ,
       _List , Length[#] , 
       __ , Null ] & /@ { "abc", {1, 2, 3, 4}, Pi}

{3, 4, ноль}

person agentp    schedule 15.06.2015

Попробуйте что-то вроде

If[#2 == 0, 0, #1/#2] &

для вашей чистой функции.

person High Performance Mark    schedule 12.06.2015
comment
Благодарю. похоже, я не могу выполнять сопоставление с образцом в чистой функции, верно? Мой пример надуманный. Да, я могу проверить, равен ли второй аргумент нулю. Я искал способ сделать сопоставление с образцом в целом. - person akonsu; 12.06.2015
comment
If[MatchQ[ #, pattern ], ... ] & ... или вы можете посмотреть на Switch - person agentp; 12.06.2015
comment
@agentp спасибо, я использовал Switch, опубликуйте этот комментарий как ответ - person akonsu; 13.06.2015

Можно использовать комбинацию Replace и Condition для достижения аналогичного сопоставления шаблонов с аргументами чистой функции.

Replace[_, {_ /; #2 == 0 -> 0, _ :> #1/#2}] &

Например

Replace[_, {_ /; #2 == 0 -> 0, _ :> #1/#2}] &[a, 2]

a/2

а также

Replace[_, {_ /; #2 == 0 -> 0, _ :> #1/#2}] &[a, 0]

0


Дополнительные подходы и более подробное обсуждение можно найти по адресу https://mathematica.stackexchange.com/questions/3174/using-patterns-in-pure-functions

person Karsten 7.    schedule 01.05.2016