Как использовать сопоставление на уровне аргументов, возможно ли это? Guards?

например

let When true d = d
let foo = () |> When false

Так что у меня есть побочный эффект, который мне не нравится, потому что это ошибка: MatchFailureException

Я знаю, что у меня может быть хороший побочный эффект: let foo = if false then()

Но предупреждение о Incomplete pattern matches on this expression. говорит мне, что я могу добавить то, что мне нужно. Я просто не знаю, как и если это возможно? Еще один способ, почему я даже могу использовать значения в качестве аргументов?

Кстати: я знаю, что я могу писать When bd = if b then d else() но вопрос более общий.

добавлено объяснение в haskell

let wh :: Bool -> IO () -> IO ()
 wh True f = f
 wh False f = return ()
2 ответа

Тот факт, что это разрешено, является скорее причудой спецификации, и на самом деле вы можете делать такие вещи, как

let (a,b) = 1,2

Ваш вопрос не особенно ясен, но я думаю, что вы ищете что-то вроде

let 1 |2 = 1

По сути, синтаксис такой же, как после матча, за исключением того, что вам не нужен первый |

Обратите внимание, что это позволяет использовать самый сумасшедший фрагмент кода F #, который я написал через некоторое время:

let 1 = 2

Это будет скомпилировано (с предупреждением), но сбой во время выполнения.


Когда вы пишете что-то вроде:

let When true d = d

Вы говорите F #, чтобы создать функцию, которая принимает два аргумента, и вы сопоставляете два аргумента с шаблонами true и d, соответственно. true модель неполна и не работает, когда вход не является true значением. d шаблон является переменным связыванием, и он всегда преуспевает.

Тот факт, что вы можете использовать неполные шаблоны в аргументах объявлений функций, не особенно полезен (но я полагаю, вы могли бы использовать более сложный шаблон, который компилятор просто не может проверить).

Неполные шаблоны действительно имеют смысл только тогда, когда вы используете match или когда используете function. Ключевое слово function дает вам что-то вроде охранников на других языках, но оно работает только с функциями, принимающими один аргумент. Если вы измените When чтобы принять кортеж, вы можете написать:

let When = function
 | true, f -> f()
 | false, _ -> ()

Кроме того, вы можете изменить порядок аргументов (и использовать currying), как в ответе от Vesa.AJK

licensed under cc by-sa 3.0 with attribution.