重写一个未经证实的函数haskell

use*_*600 6 haskell tuples function

我一直在学习如何在haskell中进行uncurrying和应用$函数,但是我仍然遇到将未经验证的函数转换为不那么神秘的函数的问题.

我给的功能是

apple = map $ uncurry $ flip ($)
Run Code Online (Sandbox Code Playgroud)

我意识到这需要一个元组列表,并将元组中的相应函数应用于变量里面.所以我试着把它重写为

apple ls = foldr function _ ls
    where function (a,b) c = (uncurry b) (a,c)
Run Code Online (Sandbox Code Playgroud)

我得到_的错误作为解析错误,我不知道使用哪个起点.我需要制作这种多态,我意识到这很可能不会让它变得不那么神秘.有任何想法吗?他们将非常感激

Dan*_*zer 7

Apple有这种类型

apple :: [(a, a->b)] -> [b]
Run Code Online (Sandbox Code Playgroud)

我们可以把它重写为

apple ls = map (\(a, f) -> f a) ls
Run Code Online (Sandbox Code Playgroud)

所以写这个foldr是非常可行的,

apple ls = foldr (\(a, f) rest -> f a : rest) [] ls
Run Code Online (Sandbox Code Playgroud)

或者,我们可以将其重写为pointfree

apple = foldr ( (:) . (uncurry . flip $ ($)) ) []
Run Code Online (Sandbox Code Playgroud)

解析错误的原因是_"我不关心的变量"的特殊语法.这让你写的东西就像

 foo _ _ _ _ a = a
Run Code Online (Sandbox Code Playgroud)

并没有得到重复变量的错误.基本上我们只是_用起始的空列表填写并修复,function以便它附加到c而不是尝试应用它a.

如果我想以最清晰的方式写这个,那就是原作

apple = map . uncurry . flip $ ($)
Run Code Online (Sandbox Code Playgroud)

很好.