2017-09-16 142 views
2

学习Haskell的第一原则。 Haskell的绝对初学者。 如果:Haskell定义类型

data A 
data B 
func :: A -> B 
func = undefined 

实际功能是什么?虽然锻炼负荷很大(也感谢你),但我再次卡住了。 A - > B是否表示两种不同的类型,如'字符串' - >'字符'?试图把我的头包裹起来。

+0

没有大写字母是真正的类型。小写字母是类型变量。 –

+0

如果这是实际的代码,那么'undefined'在某种意义上是'func'的唯一有效定义。 'B'没有人居住,所以无法从'func'返回'B'的值。 (对于这个问题,也没有办法调用'func',因为没有任何'A'作为参数提供的值。) – chepner

回答

5

不,(具体)类型以大写字母开头。所以A -> B意味着类型AB您已经定义(当然这里不是定义)与data A = ...表情,例如像:

data A = Foo | Bar Int | Qux String A 

万一签名包含有小写的标识符,它是一个类型变量。例如foo :: a -> b,意思是ab可以被任何类型取代。所以foo是一个函数,可以是A -> B,但也可以是A -> Int,Char -> BChar -> Int

您还可以添加类型约束的签名,以限制可用于其例如ab类型。类似于foo :: (Show a, Num b) => a -> b限制了ab,使得对于类型ab存在instance Show ainstance Num b,使得foo被定义在这些类型上。

-1

谢谢威廉,谢普纳。你的答案帮助我想出了:

data A 
data B 
funcAJ :: A -> B 
funcAJ a = a 
     where a = b 
      b = undefined 

这种类型为funcAJ :: A - > B,据我了解。非常感谢!

+2

这不符合你的想法。 'where'中的'a'正在映射函数参数'a'。它们是具有相同名称的不同变量。作为函数参数的'a'是类型'A',而函数'where'中定义的函数是'B'类型。这是因为它被定义为评估为'b',而后者被定义为'undefined'。未定义可以承担(几乎)任何类型。所以这只是写'funcAJ a = undefined'的一种奇特的方式。 – Potato44

+0

好的。谢谢,但我寄予了很高的期望。我现在失去了。你能提出一个类型检查并且正确的函数吗? – Madderote

+0

除非你给你的类型'A'和'B',一些数据构造函数'undefined'(或者其他返回底部的构造函数)是'A - > B'类型函数的唯一可能的实现。 – Potato44