我对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)
你的代码没有运行,我试图修复它,但变量名称让我失望。如果你的名字是(1)更短和( 2)用英文 –
也请明确说明你在问什么,并定义你没有显示的代码不是标准功能的功能。 – Squazic
现在,我会说,我不认为你明白'返回'在诸如Haskell之类的函数式语言中的含义。 – Squazic