Uncertain<T>
Люди слишком уверены в себе. В коде это проявляется так:
if currentLocation.distance(to: target) < 100 {
print("Вы прибыли!") // А точно ли? 🤨
GPS-координаты приблизительны, но Bool
требует выбора. Мы «схлопываем волновую функцию» слишком рано.
В 2014 г. исследователи предложили тип Uncertain<T>
, встроенный в систему типов. Я портировал идею на Swift:
import Uncertain
let loc = Uncertain<CLLocation>.from(currentLocation)
let nearby = loc.distance(to: target) < 100
if nearby.probability(exceeds: 0.95) {
print("Вы прибыли!") // с 95 % уверенности
}
Сравнение возвращает не Bool
, а Uncertain<Bool>
— вероятность истинности. Под капотом используется распределение Рэлея и метод Монте-Карло; выборка происходит только при необходимости, а SPRT экономит вычисления.
let speed = 400 / Uncertain<Double>.normal(mean: 60, sd: 5)
let ok = speed < 6
print(ok.probability(exceeds: 0.9))
Такой подход делает неопределённость первоклассной и заставляет писать более умный код.