Здравствуйте, nikov, Вы писали:
N>Как на Haskell написать функцию :: [a] -> (), которая равна (), если список пуст или хотя бы одно значение из списка не _|_, и _|_ в противном случае? N>На машине Тьюринга такое сделать можно.
import Data.Unamb
main = print foldr1 unamb $ map (\x -> x `seq` ()) [error"a", error"b", 42]
Учтите, там внутри запускаются потоки и довольно-таки нестандартным образом обрабатываются исключения; кроме того, unamb имеет предусловие, нарушение которого ломает ссылочную прозрачность.
N>>>Как на Haskell написать функцию :: [a] -> (), которая равна (), если список пуст или хотя бы одно значение из списка не _|_, и _|_ в противном случае? N>>>На машине Тьюринга такое сделать можно. T>>
Здравствуйте, nikov, Вы писали:
N>Как на Haskell написать функцию :: [a] -> (), которая равна (), если список пуст или хотя бы одно значение из списка не _|_, и _|_ в противном случае? N>На машине Тьюринга такое сделать можно.
А что есть _|_ на машине тьюринга?
Какой _|_ на хаскеле, вечный цикл или undefined?
А так, запусти процессы, делающие putMVar после успешного seq и жди этой MVar. Собственно unamb делает примерно это.
Как на Haskell написать функцию :: [a] -> (), которая равна (), если список пуст или хотя бы одно значение из списка не _|_, и _|_ в противном случае?
На машине Тьюринга такое сделать можно.
N>Как на Haskell написать функцию :: [a] -> (), которая равна (), если список пуст или хотя бы одно значение из списка не _|_, и _|_ в противном случае? N>На машине Тьюринга такое сделать можно.
Здравствуйте, nikov, Вы писали:
N>Как на Haskell написать функцию :: [a] -> (), которая равна (), если список пуст или хотя бы одно значение из списка не _|_, и _|_ в противном случае? N>На машине Тьюринга такое сделать можно.
Под _|_ понимается бесконечное вычисление? То есть явный undefined мы выкидываем?
Здравствуйте, thesz, Вы писали:
N>>Как на Haskell написать функцию :: [a] -> (), которая равна (), если список пуст или хотя бы одно значение из списка не _|_, и _|_ в противном случае? N>>На машине Тьюринга такое сделать можно.
T>
Здравствуйте, nikov, Вы писали:
N>Как на Haskell написать функцию :: [a] -> (), которая равна (), если список пуст или хотя бы одно значение из списка не _|_, и _|_ в противном случае? N>На машине Тьюринга такое сделать можно.
Здравствуйте, thesz, Вы писали:
T>Пусть мне покажут, как проверить невычислимость на машине Тьюринга, тогда я сделаю и на ФЯ.
Проверить невычислимость нельзя, но благодаря наличию универсальной машины можно запустить несколько вычислений параллельно, и ждать остановки хотя бы одного из них.
T>>Пусть мне покажут, как проверить невычислимость на машине Тьюринга, тогда я сделаю и на ФЯ. N>Проверить невычислимость нельзя, но благодаря наличию универсальной машины можно запустить несколько вычислений параллельно, и ждать остановки хотя бы одного из них.
Bottom это не только "нет остановки". Точнее, это самый неинтересный случай.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
T>>Пусть мне покажут, как проверить невычислимость на машине Тьюринга, тогда я сделаю и на ФЯ.
N>Проверить невычислимость нельзя, но благодаря наличию универсальной машины можно запустить несколько вычислений параллельно, и ждать остановки хотя бы одного из них.
import Control.Parallel
notABot [] = ()
notABot (x:xs) = (x `pseq` ()) `par` notABot xs
loop = loop
result = 2
test = notABot [loop,result]
main = do
print test
putStrLn "Hi!"
Удовлетворительно ль?
А теперь говори, как ты собрался пользоваться результатами работы этой функции?
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, nikov, Вы писали:
N>Как на Haskell написать функцию :: [a] -> (), которая равна (), если список пуст или хотя бы одно значение из списка не _|_, и _|_ в противном случае? N>На машине Тьюринга такое сделать можно.
В данном случае чистота функции checkBottom лежит на моей ответственности. Т.е. при bottom она выдаёт bottom, а в остальных случаях всегда одно и то же значение. Так что IO там только для деталей реализации.
Собственно, в unamb что-то типа этого и сделано.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, thesz, Вы писали:
T>>Bottom это не только "нет остановки". Точнее, это самый неинтересный случай.
N>А какие еще? Вроде бы только ошибка, но ее перехват, в отличие от незавершающегося вычисления, не представляется затруднительным.
К примеру ядерная боеголовка, упавшая на твой дом тоже _|_
Как более приближенный к жизни вариант — вычисление с unsafePerfomIO в ходе которого получаем BSOD
T>>Bottom это не только "нет остановки". Точнее, это самый неинтересный случай. N>А какие еще? Вроде бы только ошибка, но ее перехват, в отличие от незавершающегося вычисления, не представляется затруднительным.
И как ты это хочешь сделать?
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)