/ / Оцінка заяв "щось <- матеріал" - haskell, monads, lazy-evaluation, оцінка, порядок оцінки

Оцінка "щось <- матеріалу" висловлювання - haskell, монад, лінь-оцінка, оцінка, порядок-оцінка

Чи правда, що висловлювання подібні 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 називається "дія"?

Зазвичай цю лінію називають монадичною зв'язати. Деякі монади (наприклад, списки) дійсно не "діють" будь-яким змістовним способом.