2012-06-29 2 views
1

У меня проблема с Haskell. У меня есть простой код: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

На данный момент я скажу, что я не думаю, что вы понимаете, что означает 'return' на функциональном языке, таком как 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 

MonadPlus ограничение на m исходит от использования 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 выглядело как:

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 ... Shit. – mergeconflict

Смежные вопросы