首页 > 解决方案 > 理解 Haskell 中的类型和术语

问题描述

以下哪些类型属于同一类型:

一世。a -> b -> c -> d

ii. (a -> b) -> c -> d

iii. a -> (b -> c) -> d

iv. a -> b -> (c -> d)

v. (a -> b) -> (c -> d)

六。((a -> b) -> c) -> d

七。a -> (b -> (c -> d))

(b) 在下列术语中,给定 x,y,z:: 整数,函数 f 的类型是什么:

一世。(fx) (y, z)

ii. fxyz

iii. f (x,y,z)

iv. f (x,(y,z))

(c) 给出下列术语的类型(如果它们确实是类型的话)并指出哪些是相等的:

一世。“A B C D”

ii. [('A B C D')]

iii. ('A B C D'])

iv. 'A B C D':[])

v. ["ab","cd"]

我不是在寻找解决方案,但我需要帮助理解 () 的用法及其含义。谢谢你。

标签: haskellsyntax

解决方案


在类型中,->关联到右侧,即a -> b -> c实际上意味着a -> (b -> c). 这是一个函数,它接受一个类型的参数a并返回一个类型的函数b -> c

相比之下,(a -> b) -> c是一个函数,它以type的函数a -> b作为参数,并返回 type 的值c

这里有一些例子

foo :: Int -> Bool -> String
-- the same as foo :: Int -> (Bool -> String)
-- takes Int, returns function
foo n = \b -> if b && n> 5 then "some result" else "some other result"

bar :: (Int -> Bool) -> String
-- takes function, returns string
bar f = if f 43 then "hello" else "good morning"

-- bar can be called in this way
test :: String
test = bar (\n -> n > 34)    -- evaluates to "hello"

调用函数时,如 中f x y z,应用程序向左关联,如中(((f x) y) z)。例如,这些是等价的:

foo 5 True
(foo 5) true

相比之下,(,,,,)逗号里面是组成元组的方式,与应用无关。因此,[(’a’,’b’),(’c’,’d’)]是对的列表。相反,在您的示例(’a’:[’b’]):(’c’:[’d’])中没有逗号,因此括号仅用于分组,并且表达式具有相同的含义

x : y
where x = 'a':['b']
      y = 'c':['d']

试着想想应该xy有什么类型,然后想想 的类型(x : y如果有的话)。


推荐阅读