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

2 回答 2

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 能够处理波兰语代码还需要几年的时间。普热普拉萨姆:(

于 2012-06-30T04:42:34.393 回答
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

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

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

(替换sometype为适当的单态类型;如果结果make_list是,如帖子所示,则将在签名[[String]]中替换)。sometype

于 2012-06-29T21:32:41.927 回答