haskell - 理解 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"]
我不是在寻找解决方案,但我需要帮助理解 () 的用法及其含义。谢谢你。
解决方案
在类型中,->
关联到右侧,即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']
试着想想应该x
和y
有什么类型,然后想想 的类型(x : y
如果有的话)。
推荐阅读
- python - 在 Discord.py 上使用 MongoDB 执行计划任务
- firebase - 如何在特定时间戳上发送推送通知?
- flutter - integration_test 包可以和 webview 交互吗?
- windows-installer - InstallShield:回滚期间未调用自定义操作
- spring - 如何同时运行 Spring Boot 测试?
- gnuplot - 获取使用 gnu plot contour 函数自动生成的等高线级别
- c++ - 使用迭代器时在 STL 中删除和添加元素
- vue.js - VueJS - 使用子组件时如何正确使用v-model
- clang-format - 我可以在 ubuntu18.04 上安装 clang-format-10
- python - 如何获得最大气泡python plotly open street map的半径?