当对函数产品使用Foldr递归模式时,我们得到:
product [] = 1
product (x:xs) = x * product xs
Run Code Online (Sandbox Code Playgroud)
我的问题是,'product [] = 1'是什么意思?例如,对于sum函数,我们有sum [] = 0?这是答案的某种限制吗?
先感谢您.
所以我现在正在学习Haskell,我遇到了这个问题:
函数的类型
f应该是a->[a]->a.以下定义f不正确,因为它们的类型都不同于a->[a]->a:Run Code Online (Sandbox Code Playgroud)i. f x xs = xs ii. f x xs = x+1 iii. f x xs = x ++ xs iv. f x (y:ys) = y
我看到的答案是:
i) f :: a -> a -> a
Run Code Online (Sandbox Code Playgroud)
这是因为x或xs可以是任何值而不是列表,因为它不包含':'运算符.
ii) f :: Int -> a -> Int
Run Code Online (Sandbox Code Playgroud)
这是因为+运算符用于x,意味着x是Int类型.
iii) f :: Eq a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)
使用++运算符,因此为了连接它们必须是相同的类型..?
iv) f :: a -> [a] -> a
Run Code Online (Sandbox Code Playgroud)
f从列表中返回一个元素.
最后一个肯定是错的,因为它不能是a - > [a] …
我正在学习Haskell,但我发现很难理解什么似乎是最基本的东西!首先,了解类型.例如,我真的不了解这些函数的类型,
threetimes f x = f (f (f x))
Run Code Online (Sandbox Code Playgroud)
要么
triple x = x * 3
Run Code Online (Sandbox Code Playgroud)
不会将三倍x和三倍为整数类型,因为它们采用值并对它们应用操作?
在查看最后一个函数时,
last xs = head (reverse xs)
Run Code Online (Sandbox Code Playgroud)
最后的类型是什么?
多谢你们.对不起,如果问题似乎是基本的!
我试图围绕Haskell中的编程约定和规则.我发现令人困惑或难以理解的一件事是使用括号().任何人都可以向我解释在所有功能的情况下它做了什么?
all :: (a -> Bool) -> [a] -> Bool
all p xs = and [ p x | x <- xs ]
Run Code Online (Sandbox Code Playgroud)
据我了解,函数的类型显示了类型约束,输入和输出.不会
all :: [a] -> Bool
Run Code Online (Sandbox Code Playgroud)
足够?