У меня проблема с Haskell. У меня есть простой код:
petla szerokosc wysokosc pozycje = do
let plansza_x = oznacz_pola_dookola_jako_miejsca_na_skarby_wiele
pozycje
(utworz_plansze pozycje szerokosc wysokosc)
szerokosc
let x = make_list $ zlicz_x plansza_x
guard ((sprawdz_kombinacje2 plansza_x pozycje (head x) szerokosc wysokosc) == True)
x
Параметры хорошие, но GHCI возвращает мне что-то странное. функция make_list
возвращает список строк, например: [['_','_'],['*','_'],['_','*'],['*','*']]
.
Я хочу, чтобы loop
получил первый элемент этого списка, вставил его в качестве аргумента в sprawdz_kombinacje2
. Если эта функция вернет False
, это будет чистый элемент из списка. В противном случае функция petla
должна вернуть строку, например: ['_','*']
.
Проблема: когда я запускаю эту функцию в GHCI, она возвращает мне пустой список, но этого не должно быть:
*Main> petla 2 2 [(1,1,1)]
[]
Но когда я добавил return
в последнюю строку:
petla szerokosc wysokosc pozycje = do
let plansza_x = oznacz_pola_dookola_jako_miejsca_na_skarby_wiele
pozycje
(utworz_plansze pozycje szerokosc wysokosc)
szerokosc
let x = make_list $ zlicz_x plansza_x
guard ((sprawdz_kombinacje2 plansza_x pozycje (head x) szerokosc wysokosc) == True)
return x
и я скомпилировал его и запустил эту функцию с теми же аргументами, что и раньше, GHCI возвращает мне:
*Main> petla 2 2 [(1,1,1)]
<interactive>:1:0:
Ambiguous type variable `m' in the constraint:
`Control.Monad.MonadPlus m'
arising from a use of `petla' at <interactive>:1:0-18
Probable fix: add a type signature that fixes these type variable(s)
return
в функциональном языке, таком как Haskell. - person Squazic   schedule 30.06.2012