手工或精神上找出功能组合的类型

时间:2018-02-08 06:25:39

标签: haskell type-systems

我的尝试目前是这样的:如果我有(.) const const。第一

(.) const :: 
(b→c)→((a→b)→(a→c)) (a→(b→a)) = 
(b→c)→((a→b)→(a→c)) (b→(d→b)) = -- (1) See below question
(a→b)→(a→(d→b)) = -- substitute (b→c) by (b→(d→b))

下一步

(.) const const :: 
(a→b)→(a→(d→b)) (a→(b→a)) =
(a→b)→(a→(d→b)) (a→(e→a)) = -- (1) See below question
a→(d→(e→a)) -- substitute (a→b) by (a→(e→a)
  1. 我知道有些变量必须匹配,有些变量不同但有同名的巧合,并改变了它。有没有正式的,正确的方法呢?
  2. 我想在精神上做,有好的练习吗?我应该从哪里开始?
  3. 如果有人用FP语言编程,了解功能组合的结果似乎是非常有效的技能。

2 个答案:

答案 0 :(得分:4)

以下是我在精神上的表现。

我有x->y类型的函数和类型z->t的函数。如果我想撰写它们,yz必须是同一类型,结果将是x->t类型。

对于const . const,两个函数都有a -> (b -> a)类型,但我需要重命名变量以避免冲突。我有a->(b->a)c->(d->c)。现在cb->a相同。我用第二种类型替换后者,最终结果是a->d->b->a

答案 1 :(得分:0)

学习lambda演算,简单地输入lambda演算似乎是一个更有活力的方法的良好开端。

(\f g x -> f (g x)) (\a b -> a) (\a b -> a) =
(\x -> (\a b -> a) ((\a b -> a) x)) =
(\x -> (\a b -> a) (\b -> x)) = 
(\x -> (\a b -> a) (\c -> x)) = 
(\x -> (\b -> (\c -> x)))