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 モナドを使用すると、次のようになります。

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 プロンプトでは、呼び出しコンテキストはありません。MonadPlusしたがって、使用するインスタンスをghci に指示する必要があります。定義されているファイルで型シグネチャを提供することによってpetla(または、プロンプトで定義されている場合は、定義とともに型シグネチャを提供することによって)、またはで入力された式の型シグネチャを提供することによって、それを行うことができますたとえば、ghciプロンプト

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

(sometype適切なモノモーフィック型に置き換えます。make_list投稿で示されているように、の結果が である場合、署名で[[String]]置き換えられます)。sometype

于 2012-06-29T21:32:41.927 に答える