Да.
Вы кодируете свои инварианты в системе типов Haskell. Затем компилятор принудительно выполнит (например, выполнит проверку типа), чтобы предотвратить компиляцию вашей программы, если инварианты не удерживаются.
Для упорядоченных списков вы могли бы рассмотреть дешевый подход к реализации умного конструктора , который изменяет тип списка при сортировке.
module Sorted (Sorted, sort) where
newtype Sorted a = Sorted { list :: [a] }
sort :: [a] -> Sorted a
sort = Sorted . List.sort
Теперь вы можете написать функции, которые предполагают, что Sorted
удерживается, и компилятор предотвратит передачу несортированных вещей этим функциям.
Вы можете пойти намного дальше и закодировать чрезвычайно богатые свойства в систему типов. Примеры:
С практикой, довольно сложные инварианты могут быть применены языком во время компиляции.
Однако существуют ограничения, так как система типов не предназначена для проверки свойств программ. Для тяжелых доказательств рассмотрите проверку моделей или теоремы, доказывающие языки, такие как Coq. Язык Agda - это язык, похожий на Haskell, система типов которого предназначена для доказательства богатых свойств.
В PowerShell вы можете рассматривать пустые / пустые строки как логическое.
$x = $null
if ($x) { 'this wont print' }
$x = ""
if ($x) { 'this wont print' }
$x = "blah"
if ($x) { 'this will' }
Итак .... сказав, что вы можете сделать:
$Parameter.Value = $(if ($x) { $x } else { [DBNull]::Value })
Но я ' d, скорее, оберните это функцией, например:
function CatchNull([String]$x) {
if ($x) { $x } else { [DBNull]::Value }
}
Я не знаю о PowerShell , но в C # я бы сделал что-то вроде этого:
if ([string]::IsNullOrEmpty($objUser.Telephone))
{
$objDbCmd.Parameters["@telephone"].Value = [DBNull]::Value;
}
else
{
$objDbCmd.Parameters["@telephone"].Value = $objUser.Telephone;
}