给定一个像 的函数negate,它具有类型签名:
negate :: Num a => a -> a
Run Code Online (Sandbox Code Playgroud)
我将其描述为a上下文中的类型Num(如果您认为我错了,请纠正我)。
但我不完全确定如何描述last具有类型签名的类似:
last :: [a] -> a
Run Code Online (Sandbox Code Playgroud)
我的猜测是说它不是特定于类型的,并且它需要一个列表并生成一个与列表相同类型的值。这是正确的思考方式吗?
在我关注的有关 Haskell 的课程中,我正在学习类型声明。目前,它正在讨论缩写,我对此感到困惑,而且我无法在网上找到我正在寻找的信息。
它给出了以下示例:
type Pair a = (a, a)
Run Code Online (Sandbox Code Playgroud)
连同一段文字: Abbreviations - new name for existing types
我在文档中看到了一个与上面代码非常相似的示例:
type Name = String
Run Code Online (Sandbox Code Playgroud)
但从中我仍然无法理解上面的例子。
我正在努力理解它试图解释的内容,所以其他人可以为我理解它并给出它在程序中使用的简单示例吗?
concat的代码:
concat :: [[a]] -> [a]
concat xss = [x | xs <- xss, x <- xs]
Run Code Online (Sandbox Code Playgroud)
我不明白它是如何被阅读的。如何xss拆分为xs和x?还是我误读了?
例如,给定:
concat [[1,2,3],[4],[5]]
Run Code Online (Sandbox Code Playgroud)
是如何[1,2,3,4,5]实现的?
正如标题所暗示的那样,我不确定方括号和圆括号在列表方面的区别。
Haskellinsert定义的两个版本,一个使用方括号,另一个使用括号:
insert' :: Int -> [Int] -> [Int]
insert' y [] = [y]
insert' y (x:xs) | y <= x = y:x:xs | otherwise = x : insert' y xs
----
insert' y [x:xs] | y <= x = y:x:xs | otherwise = x : insert' y xs
Run Code Online (Sandbox Code Playgroud)
的第二个定义insert'不起作用的原因是什么?
它给出的错误消息,对于任何想知道的人:
test.hs:3:12: error:
• Couldn't match expected type ‘Int’ with actual type ‘[Int]’
• In the pattern: x : xs
In the pattern: [x : xs] …Run Code Online (Sandbox Code Playgroud)