Я наконец-то дочитал пару ламмерский введений по хаскелю. И тут же решил посмотреть что там с гринлетами и прочими модными плюшками. В итоге, я так понял, популярны два подхода:
1) CHP http://www.cs.kent.ac.uk/projects/ofa/chp/tutorial.pdf (жалкие 22 страницы туториала)
2) Concurrent Haskell http://research.microsoft.com/en-us/um/people/simonpj/papers/marktoberdorf/ma... (всего лишь 46 страниц туториал)
Вторую доку я дочитал до конца (хотя понимание происходящего потерял гораздо раньше).
Так вот то что в C делается for (int v=0, i=1; i<=n; i++) { v = v+i ; }; return v на хаскеле выглядело вот так (это из второй доки):
count :: Int -> IO Int
count n = do { r <- newIORef 0;
loop r 1 }
where
loop :: IORef Int -> Int -> IO Int
loop r i | i>n = readIORef r
| otherwise = do { v <- readIORef r;
writeIORef r (v+i);
loop r (i+1) }
В первой доке код чуток менее кривой, но... В общем, все эти монады для (сетевого) io мне показались страшными костылями. Это я чего-то не понимаю или в хаскеле concurrency в зачаточном состоянии?
Второй вопрос что меня мучает это большие структуры данных. Вот мне, допустим, надо в большом дереве пару узлов поменять. Такое реально сделать в хаскеле без особых костылей? Или он просто не расчитан на такое?
Спрашиваю потому что хочу понять для себя добивать ли хаскель или уже одним глазом в сторону эрланга начинать смотреть.