对不起,这可能是一个愚蠢的问题 - 目前正在努力学习Haskell;
我正在尝试构建一个基本函数,它将在数字上创建无限的平方根列表,因此我可以使用take函数及其工作方式进行练习。
我写了以下代码;
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 :(得分:3)
Haskell函数调用不使用括号。您似乎期待这样:
infisqrt x = infisqrt'((x :: Float) [])
表示"将x
和[]
作为inifsqrt
的参数传递。"但是,对于编译器,它实际上意味着将[]
作为x
的第一个参数传递,然后将结果传递给infisqrt'
。"如果你拿出额外的括号,你应该开始获得牵引力:
infisqrt x = infisqrt' (x :: Float) []
(记住,你在infisqrt'
的定义中也有同样的事情)
作为旁注,通常最好放置参数'函数类型声明中的类型:
infisqrt :: Float -> [Float]
infisqrt x = infisqrt' x []