Чи правда, що висловлювання подібні something <- stuff
завжди оцінюються в Haskell, навіть коли something
не викликається в решті коду? (є something <- stuff
називається "дія"? - Я не знаю технічної формули).
Якщо це правда, у мене є інше питання.
У мене є код, який починається так:
computeContour3d voxel voxmax level = do
voxelmax <- somefunction voxel
let max" = fromMaybe voxelmax voxmax
Тобто, якщо аргумент voxmax
не Nothing
, потім voxelmax
немає необхідності, оскільки max" = fromJust voxmax
в цьому випадку. Тому, якщо відповідь на моє перше запитання - «Так», як я можу уникнути оцінки voxelmax
коли це не потрібно?
Відповіді:
5 за відповідь № 1Ні, монадична прив'язка не є гарантією того, що все оцінюється. Є ледачі монади; напр. читач монади не примушував результату somefunction voxel
якщо не voxmax
був Nothing
.
Але немає ніяких підстав покладатися на таку поведінку, легко можна надійно уникнути додаткових обчислень:
computeContour3d voxel voxmax level = do
max" <- case voxmax of
Nothing -> somefunction voxel
Just max -> return max
-- use max"
Ви можете розглянути можливість використання maybe
, що часто коротше, ніж явне case
, як в:
max" <- maybe (somefunction voxel) return voxmax
0 для відповіді № 2
Чи правда, що твердження, як щось <- stuff, завжди оцінюються в Haskell, навіть якщо щось не викликається в решті коду?
Не взагалі, ні. The IO
Монада змушує таку оцінку, але багатьох інших немає.
є
something <- stuff
називається "дія"?
Зазвичай цю лінію називають монадичною зв'язати. Деякі монади (наприклад, списки) дійсно не "діють" будь-яким змістовним способом.