2012-06-29 38 views
1

我对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) 
+2

你的代码没有运行,我试图修复它,但变量名称让我失望。如果你的名字是(1)更短和( 2)用英文 –

+2

也请明确说明你在问什么,并定义你没有显示的代码不是标准功能的功能。 – Squazic

+0

现在,我会说,我不认为你明白'返回'在诸如Haskell之类的函数式语言中的含义。 – Squazic

回答

5

从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) 

表示表达式petla 2 2 [(1,1,1)]具有推断类型

MonadPlus m => m sometype 

m上的MonadPlus约束来自使用guard。但是ghci没有办法知道它应该在这里使用MonadPlus的哪个实例。在程序中,通常可以从调用上下文中推断,但在ghci提示符下,没有调用上下文。因此你必须告诉ghci使用哪个MonadPlus实例。您可以通过在定义该文件的文件中提供petla的类型签名(或者,如果在提示中定义的,则通过在该文件中随同定义一起提供类型签名),或者为输入的表达式提供类型签名在ghci的提示,例如

ghci> petla 2 2 [(1,1,1)] :: [sometype] 

(与适当的单态类型替换sometype;若make_list结果为,通过后,[[String]]所示,将取代在签名sometype)。

8

GHC和GHCi,我敢肯定你知道,写在格拉斯哥。它的前几个公开发行版只接受以苏格兰语编写的代码。例如,使用RWS monad看起来像:

import Guide.Monad.RWS 

ensaumple :: RWS Int [Int] Int() 
ensaumple = dae 
    env <- aks 
    s <- git 
    lat s' = s + env 
    pit s' 
    clype [s'] 

作者有相当具有挑战性的时间本地化到英语。所以我很确定GHC能够在波兰处理代码需要几年的时间。 Przepraszam :(

+5

我有点伤心,我的巨魔回答比丹尼尔的真实答案有更多的提升。也有点开心。 – mergeconflict

+0

嗯,是不是只有在端口改为英文后才添加分层模块? –

+0

@DanielFischer ...妈的。 – mergeconflict