我在柯里化函数以删除 Haskell 中的三个参数时遇到问题。
免责声明:不是课程作业,今天有人问我这个问题,这个问题一直困扰着我。
我们得到的自定义类型/函数是(只能记住类型)
type MyThing
= (Char, String)
type MyThings
= [MyThing]
funcA :: MyThings -> String -> String
funcB :: MyThings -> String -> Int -> String
我们从以下开始:
funcB as str n = iterate (funcA as) str !! n
并将其减少如下:
funcB as str n = iterate (funcA as) str !! n
funcB as str = (!!) . (iterate (funcA as)) str
funcB as = (!!) . (iterate (funcA as))
funcB as = (!!) . (iterate . funcA) as
然后,卡住了。我们只是不知道如何避免使用最后一个参数。我知道我以前在某个地方见过类似的情况并且有解决方案。
希望一些哈斯克尔天才能够指出为什么我是个白痴......
这里您所需要的只是运算符部分的以下三个“定律”:
(a `op` b) = (a `op`) b = (`op` b) a = op a b
(1) (2) (3)
以便操作数进入运算符附近的空闲槽。
For (.)
这意味着:(a . b) = (a .) b = (. b) a = (.) a b
. So,
f (g x) y !! n
= (!!) (f (g x) y) n by (3)
= ((!!) . f (g x)) y n
= ((!!) . (f . g) x) y n
= ((!!) .) ((f . g) x) y n by (1)
= (((!!) .) . (f . g)) x y n
= (((!!) .) . f . g) x y n
您应该只进行您认为合适的无点转换,以便生成的表达式仍然可读for you- 事实上,clearer比原来的。 “pointfree”工具有时会产生不可读的结果。
中途停下来是完全可以的。如果您手动完成它太困难,那么您阅读它可能也会很困难。
((a .) . b) x y = (a .) (b x) y = (a . b x) y = a (b x y)
is a 共同模式您将很快学会立即识别。所以上面的表达式可以很容易地读回为
(!!) ((f . g) x y) n = f (g x) y !! n
考虑到(.)
是结合的:
(a . b . c) = ((a . b) . c) = (a . (b . c))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)