Имея абсолютно нулевой опыт работы с Haskell, мне нужно придумать код, эквивалентный этому Python:
from random import choice, sample
def random_subset():
return tuple(sample(('N', 'S', 'W', 'E'), choice((1, 2, 3, 4))))
def form_grid(n):
return [[random_subset() for _ in range(n)] for _ in range(n)]
form_grid(10)
, который производит что-то вроде этого:
N ESWN SNEW NSE EWSN E ENSW N NSWE WES
NE WNS SWEN EWN ENWS WEN WS W ENSW NW
WENS NWE SNEW ES E S ES SENW EW WEN
NSE NE WNE NEWS SNE W SWNE NSWE SNEW EN
S SNW WNES S WESN E ES N ESN ES
SWEN S WSNE NEWS WESN E S SE E N
NEW S NEW WS W EN N NWS E WENS
WN NWE S SEW NESW EWSN WENS ES NWS WN
W NWE N N ES E E WN SWNE NES
WENS NWE NW WESN SW NES ENWS SE N SWNE
Я, ради бога, не могу обернуться вокруг концепции IO Хаскелла (в частности, случайности). Лучшее, что я мог придумать, это:
import Data.Random hiding (shuffle, sample)
import Data.Random.Source.Std
import Data.Random.Extras
randSubset :: IO [Char]
randSubset = do
len <- runRVar (choice [1..4]) StdRandom :: IO Int
subset <- runRVar (sample len ['N', 'S', 'W', 'E']) StdRandom :: IO [Char]
return subset
formGrid :: Int -> [[IO [Char]]]
formGrid n = [[subset | _ <- [0..(n - 1)], subset <- randSubset] | _ <- [0..(n - 1)]]
который еще не сделал этого:
error:
* Couldn't match expected type `[IO [Char]]'
with actual type `IO [Char]'
* In the expression: randSubset
In a stmt of a list comprehension: subset <- randSubset
In the expression:
[subset | _ <- [0 .. (n - 1)], subset <- randSubset]
|
12 | formGrid n = [[subset | _ <- [0..(n - 1)], subset <- randSubset] | _ <- [0..(n - 1)]]
| ^^^^^^^^^^
Быстрое поиск в Google не сильно помогло - я, вероятно, не использовал самые точные ключевые слова для этой проблемы, с которой я сталкиваюсь. Вносить случайные изменения и надеяться на лучшее становится довольно неприятно, но у меня действительно нет ни времени, ни энергии, чтобы должным образом погрузиться в Haskell (хотя это позор), так что пока я бы хотел, чтобы кто-то просто указал мне на то, что неправильно с этим кодом.