Haskell定义类型
学习Haskell的第一原则。 Haskell的绝对初学者。 如果:Haskell定义类型
data A
data B
func :: A -> B
func = undefined
实际功能是什么?虽然锻炼负荷很大(也感谢你),但我再次卡住了。 A - > B是否表示两种不同的类型,如'字符串' - >'字符'?试图把我的头包裹起来。
不,(具体)类型以大写字母开头。所以A -> B
意味着类型A
和B
您已经定义(当然这里不是定义)与data A = ...
表情,例如像:
data A = Foo | Bar Int | Qux String A
万一签名包含有小写的标识符,它是一个类型变量。例如foo :: a -> b
,意思是a
和b
可以被任何类型取代。所以foo
是一个函数,可以是A -> B
,但也可以是A -> Int
,Char -> B
和Char -> Int
。
您还可以添加类型约束的签名,以限制可用于其例如a
和b
类型。类似于foo :: (Show a, Num b) => a -> b
限制了a
和b
,使得对于类型a
和b
存在instance Show a
和instance Num b
,使得foo
被定义在这些类型上。
谢谢威廉,谢普纳。你的答案帮助我想出了:
data A
data B
funcAJ :: A -> B
funcAJ a = a
where a = b
b = undefined
这种类型为funcAJ :: A - > B,据我了解。非常感谢!
这不符合你的想法。 'where'中的'a'正在映射函数参数'a'。它们是具有相同名称的不同变量。作为函数参数的'a'是类型'A',而函数'where'中定义的函数是'B'类型。这是因为它被定义为评估为'b',而后者被定义为'undefined'。未定义可以承担(几乎)任何类型。所以这只是写'funcAJ a = undefined'的一种奇特的方式。 – Potato44
好的。谢谢,但我寄予了很高的期望。我现在失去了。你能提出一个类型检查并且正确的函数吗? – Madderote
除非你给你的类型'A'和'B',一些数据构造函数'undefined'(或者其他返回底部的构造函数)是'A - > B'类型函数的唯一可能的实现。 – Potato44
没有大写字母是真正的类型。小写字母是类型变量。 –
如果这是实际的代码,那么'undefined'在某种意义上是'func'的唯一有效定义。 'B'没有人居住,所以无法从'func'返回'B'的值。 (对于这个问题,也没有办法调用'func',因为没有任何'A'作为参数提供的值。) – chepner