2015-03-20 5 views
1

Итак, у меня только небольшой опыт работы с Haskell, и я работал над нижеприведенной программой, чтобы реализовать поиск, чтобы найти максимумы в функции, но я получаю нечетную ошибку. Когда я компилирую это говорит:странная ошибка синтаксиса haskell

MaximaSearch.hs: 26: 1: Ошибка синтаксического анализа (возможно, неправильно отступов или несоответствующие скобки)

Это линия, которая говорит, что «основные = делать», так что я думаю, что это какая-то отставая ошибку с моих отступов в коде предыдущей, но я не могу заметить ни одной ошибки ...

Вот код:

module Main where                 
    g :: Float -> Float                 
    --your function here                
    g x = cos(x^2)                  

    --goldenSectionSearch                
    goldenSS :: (Float -> Float) -> Float -> Float -> Float -> Float -> Float   
    goldenSS f a b c tau                
    | (c-a) < tau * (abs b + abs x) = (c+a)/2           
    |f x > f b = let                 
        t1|(c - b) > (b-a) = goldenSS f b x c tau       
        |otherwise = goldenSS f a x b tau         
        in t1                
    |otherwise = let                 
        t2|(c-b) > (b-a) = goldenSS f a b x tau        
        |otherwise = goldenSS f x b c tau         
        in t2                
    where                    
     let x                   
      | (c-b) > (b-a) = b + resphi*(c-b)          
      |otherwise = b - resphi*(b-a)            
      where resphi = 2 - phi where phi = (1+ sqrt 5)/2       
     in x                   

    --main                    
    main = do                   
      print x                  
      print (g x)                 
      where                  
       x = goldenSS g a ((a+b)/2) b tau          
       where                 
        a = 2                
        b = 3                
        tau = 0.001  

каких-либо идеи?

+1

Пожалуйста, избавиться от номера строк в вашем примере кода. – Jubobs

+0

ok, удалены номера – otg6e

+0

Есть много проблем с вашим кодом ... В частности, использование вами стражей внутри привязки 'let' довольно странно. Почему бы просто не использовать выражение 'if'-' then'-'else'? – Jubobs

ответ

1

Причина, по которой вы получаете ошибку синтаксического анализа, проистекает из неидиоматического использования привязок let и where в вашем коде.

Haskell допускает множественные синтаксические структуры для временных привязок и сопоставления образцов, но вы их смешиваете довольно странно и беспорядочно.

Чтобы узнать, как писать чистый код и таким образом, более привычную для Haskell, я рекомендую смотреть на существующие Haskell библиотеки и программы (например, на hackage), чтобы получить представление о том, как let и where переплеты обычно работают , В общем, я считаю, что для чистых функций я почти исключительно использую where (в отличие от let), но некоторые вещи стилистичны.

Что касается этого кода, я немного изменил его, чтобы использовать привязки where вместо let, и он компилируется и запускается для меня сейчас. Даже если вам придется настроить его немного, чтобы получить его, чтобы собрать для вас, это общая структура становится чище и менее вероятно, чтобы дать вам разобрать ошибки:

module Main where         

g :: Float -> Float              
g x = cos(x^2)               

goldenSS :: (Float -> Float) -> Float -> Float -> Float -> Float -> Float 
goldenSS f a b c tau           
    |(c-a) < tau * (abs b + abs x) = (c+a)/2        
    |f x > f b = t1       
    |otherwise = t2          

    where x | (c-b) > (b-a) = b + resphi*(c-b)     
      |otherwise = b - resphi*(b-a)  

     resphi = 2 - phi 

     phi = (1+ sqrt 5)/2       

     t1 |(c - b) > (b-a) = goldenSS f b x c tau       
      |otherwise = goldenSS f a x b tau  


     t2 |(c-b) > (b-a) = goldenSS f a b x tau        
      |otherwise = goldenSS f x b c tau 



main = 
    do                   
    print x                  
    print (g x)                 
    where x = goldenSS g a ((a+b)/2) b tau          
     a = 2                
     b = 3                
     tau = 0.001  
+0

Нет проблем. Я не эксперт в Haskell, но я думаю, что самое важное с отступом состоит в том, что все выстраивается в линию, в отличие от того, что они находятся на определенной глубине. Например, если вы отделите строку 'a = 2' на 2 пробела, вы получите ошибку синтаксического анализа. Но если вы отпечатаете пробелы 'where' block 2 и определения пробелов' x', 'a',' b и 'tau' 2 так, чтобы все выстроилось в линию, оно будет хорошо компилироваться. Опять же, посмотрите на некоторые существующие проекты Haskell, и вы почувствуете это. – Nathan

+0

Кроме того, всегда указывайте пробелы, а не вкладки (или измените свой редактор, чтобы он использовал пробелы для вкладки), они работают лучше. – Nathan