作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
(.) :: (b -> c) -> (a -> b) -> a -> c
f . g = \x -> f (g x)
最佳答案
( 编辑 1: 我第一次错过了您问题的几个组成部分;请参阅我的答案底部。)
考虑这种语句的方法是查看类型。你所拥有的论证形式被称为三段论;但是,我认为您记错了一些东西。有许多不同类型的三段论,据我所知,你的三段论并不对应于函数组合。让我们考虑一种三段论:
->
,这变成
a -> b
b -> c
a -> c
a
的值, 我可以产生一个 b
类型的值. b
的值, 我可以产生一个 c
类型的值. a
类型的值, 我可以产生一个 c
类型的值. f . g
,存在函数
g :: a -> b
告诉你前提 1 为真,并且
f :: b -> c
告诉你前提 2 是正确的。因此,您可以得出最后的语句,函数
f . g :: a -> c
对此进行了总结。是证人。
a -> b
a
b
($) :: (a -> b) -> a -> b
的类型可以看出.如果你想把它看作是一个逻辑论证,它可能是这样的形式
a
的值, 我可以产生一个 b
类型的值. a
的值. b
的值. f x
.函数
f :: a -> b
是命题 1 为真的证人;值
x :: a
是命题 2 为真的证人;因此结果可以是
b
类型,证明结论。这正是我们从证明中发现的。
(forall x. B x -> H x) -> B a -> H a
,但我几乎可以肯定那是错误的。另一个猜测是更简单的类型,如
(B x -> H x) -> B Int -> H Int
,其中
Int
代表阿里,但同样,我几乎可以肯定这是错误的。再次:如果你知道,也请告诉我!
filter (\mn -> not $ null mn) middleNames
.类似地,我们可以很容易地用
head
得到某人的中间名首字母。 ,所以我们只需要
map head filteredMiddleNames
以获取列表。换句话说,我们有以下代码:
allMiddleInitials :: [Char]
allMiddleInitials = map head $ filter (\mn -> not $ null mn) middleNames
getMiddleInitials :: [String] -> [Char]
getMiddleInitials middleNames = map head $ filter (\mn -> not $ null mn) middleNames
map
有类型
(a -> b) -> [a] -> [b]
,以及自
head
有类型
[a] -> a
,
map head
有类型
[[a]] -> [a]
.同样,
filter
有类型
(a -> Bool) -> [a] -> [a]
,等等
filter (\mn -> not $ null mn)
有类型
[a] -> [a]
.因此,我们可以去掉参数,而是写
-- The type is also more general
getFirstElements :: [[a]] -> [a]
getFirstElements = map head . filter (not . null)
not
有类型
Bool -> Bool
, 和
null
有类型
[a] -> Bool
,所以
not . null
有类型
[a] -> Bool
: 它首先检查给定的列表是否为空,然后返回是否为空。顺便说一下,这个转换把函数改成了
point-free style ;也就是说,结果函数没有显式变量。
.
的优先级和
$
运算符(也可能是函数应用程序)。在 Haskell 中,就像在算术中一样,某些运算符的优先级高于其他运算符,因此绑定(bind)得更紧密。例如,在表达式
1 + 2 * 3
中,这被解析为
1 + (2 * 3)
.这是因为在 Haskell 中,以下声明是有效的:
infixl 6 +
infixl 7 *
f x % g y
将解析为
(f x) % (g y)
对于任何运营商
%
.
.
(组成)和
$
(application) 运算符具有以下固定性声明:
infixr 9 .
infixr 0 $
.
运算符比任何其他运算符绑定(bind)得更紧密(函数应用程序除外),并且
$
结合不那么紧密。因此,表达式
f . g $ h
将解析为
(f . g) $ h
;事实上,对于大多数运营商来说,
f . g % h
将是
(f . g) % h
和
f % g $ h
将是
f % (g $ h)
. (唯一的异常(exception)是少数其他零或九个优先运算符。)
关于函数构成 AND 函数应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3116165/
我是一名优秀的程序员,十分优秀!