2014-11-15 1 views
0

Извините за то, что, вероятно, идиотский вопрос - пытается узнать Хаскелл на данный момент;Бесконечные квадраты Корни: не могут соответствовать ожидаемому типу и не могут построить бесконечный тип

Я пытаюсь создать базовую функцию, которая создаст бесконечный список квадратных корней на число, поэтому я могу получить практику с функцией принятия и как она работает.

Я написал следующий код;

infisqrt x = infisqrt'((x :: Float) []) 

-- helper method 
infisqrt' x xs = infisqrt'(sqrt(x) (xs ++ [(sqrt(x))])) 

Однако при попытке загрузить библиотеку это возвращается с двумя ошибками;

:l isq 

isq.hs:1:24: 
Couldn't match expected type ‘[t0] -> a’ with actual type ‘Float’ 
Relevant bindings include 
    infisqrt :: Float -> [a] -> t (bound at isq.hs:1:1) 
The function ‘x :: Float’ is applied to one argument, 
but its type ‘Float’ has none 
In the first argument of ‘infisqrt'’, namely ‘((x :: Float) [])’ 
In the expression: infisqrt' ((x :: Float) []) 

isq.hs:5:33: 
Occurs check: cannot construct the infinite type: a ~ [a] -> a 
Relevant bindings include 
    xs :: [a] (bound at isq.hs:5:13) 
    x :: a (bound at isq.hs:5:11) 
    infisqrt' :: a -> [a] -> t (bound at isq.hs:5:1) 
In the first argument of ‘sqrt’, namely ‘(x)’ 
In the first argument of ‘infisqrt'’, namely 
    ‘(sqrt (x) (xs ++ [(sqrt (x))]))’ 

Может ли кто-нибудь сообщить мне, где я ошибаюсь?

+0

несовершеннолетний примечание стороны: 'Float' вроде типа специального назначения, используется в основном для алгоритмов, разработанных специально вокруг него, или в определенных ситуациях, когда размер важнее точности. В большинстве случаев тип с плавающей запятой вам нужен «Double». – dfeuer

+0

Я закрыл этот вопрос. Нет ничего * неправильного * с вопросом, но маловероятно, что кто-либо, совершивший эту конкретную ошибку в будущем, сможет его найти, - они получат другое сообщение об ошибке, описывающее разные типы, в процессе выполнения чего-то другого , – dfeuer

ответ

3

Функция вызова Haskell не использует круглые скобки. Похоже, что вы ожидали этого:

infisqrt x = infisqrt'((x :: Float) []) 

означает «пройти x и [] в качестве аргументов inifsqrt.» Однако для компилятора это означает «передать [] в качестве первого аргумента x, а затем передать результат infisqrt'». Если взять дополнительные скобки, вы должны начать получать тяги:

infisqrt x = infisqrt' (x :: Float) [] 

(помните, что у вас есть то же самое происходит в определении infisqrt' «s)

Как примечание стороны, это как правило, предпочтительнее ставить типы аргументов в типе функции декларации:

infisqrt :: Float -> [Float] 
infisqrt x = infisqrt' x [] 
+0

Это на самом деле то, что я пытался сделать первым - я начал добавлять пэра, думая (с итеративной точки зрения кодирования), что вместо этого сделает функцию более явной и даст мне более «значимые» ошибки. У меня есть загрузка .hs путем переключения на; 'infisqrt x = infisqrt '(x :: Float) [] - вспомогательные методы infisqrt' x xs = infisqrt '(sqrt (x)) (xs ++ [(sqrt (x))])' - но теперь я, кажется, застреваю в бесконечном цикле всякий раз, когда пытаюсь запустить «take 4 infisqrt 8». Есть идеи? – learningHaskell

+0

А, да. Проблема в том, что вы построили 'infisqrt'', чтобы принять бесконечный список результатов в качестве аргумента, но никогда не возвращать его. Написание его как 'infisqrt x = (sqrt x): (infisqrt (sqrt x))' должно работать лучше, хотя у меня возникают проблемы с тем, чтобы точно объяснить слова. –

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

  • Нет связанных вопросов^_^