我在Haskell中有以下功能
agreeLen :: (Eq a) => [a] -> [a] -> Int
agreeLen x y = length $ takeWhile (\(a,b) -> a == b) (zip x y)
Run Code Online (Sandbox Code Playgroud)
我正在努力学习如何编写'惯用'Haskell,它似乎更喜欢使用.而$不是括号,并且在可能的情况下更喜欢无点代码.我似乎无法摆脱提及x和y明确.有任何想法吗?
我认为我对点两个参数的任何函数都有同样的问题.
顺便说一下,这只是为了编写好的代码; 不是一些"使用任何必要的东西来使其无意义"的家庭作业.
谢谢.
(添加评论)感谢您的回答.你已经说服我这个功能不会从pointfree中受益.而且你也给了我一些很好的例子来练习转换表达式.这对我来说仍然很困难,而且它们似乎与Haskell一样重要,因为它指向C.
在Unix中,我创建了很多别名/函数.这是我的工作流程:
* I have a file named 'aliases.txt' in my $HOME directory
* I have a quick command to edit that file
* I have an alias named 'sa' that sources that alias file. I.e.
alias sa='. $HOME/aliases.txt
Run Code Online (Sandbox Code Playgroud)
因此,我可以快速轻松地创建,修改和使用新别名.
我试图在Powershell中重新创建相同的工作流程,但它不起作用.我的$ HOME目录中有aliases.ps1文件.我尝试创建一个'sa'别名,但当然Powershell别名不能包含参数.所以我试过了
function sa {. $HOME\aliases.ps1 }
Run Code Online (Sandbox Code Playgroud)
我可以运行它,但我的aliases.pl1文件中的更改不会反映在我的shell会话中.我假设它是因为Windows在新进程中运行'sa'函数,而Unix在同一进程中运行函数和别名.我怎样才能让我的'sa'回来?
(BTW,"每次在命令行输入'.$ HOME\aliases.ps1'"不是我正在寻找的答案.
提前致谢.
我正在写一个WxPerl程序,而不是
$panel->SetDropTarget( MyTextDropTarget->new($panel) );
Run Code Online (Sandbox Code Playgroud)
我写
$panel->SetDropTarget->( MyTextDropTarget->new($panel) );
Run Code Online (Sandbox Code Playgroud)
并且Perl没有抱怨.(Perl使用一些参数调用了一些函数,并且脚本错误输出并显示错误消息:
用法:位于./x.pl第230行的Wx :: Window :: SetDropTarget(THIS,target).
新增编辑:
好的,所以如果$ x = \&some_function,那么我理解为什么
$x->($arg1, $arg2, ...)
Run Code Online (Sandbox Code Playgroud)
调用some_function($ arg1,$ arg2,.....).
runrig的例子是一种可能性,但我很确定:1)$ panel包含一个受祝福的对象引用,而不是一个字符串.2)SetDropTarget是$ panel的一个方法(在基类中).
从错误消息中我们可以假设正在调用SetDropTarget().如果runrig的例子在这里仍然适用(我猜它确实如此),那么即使SetDropTarget后面没有括号,即我有
$panel->SetDropTarget->
Run Code Online (Sandbox Code Playgroud)
代替
$panel->SetDropTarget()->
Run Code Online (Sandbox Code Playgroud)
Perl还在调用SetDropTarget吗?(检查其参数的数量和类型,然后在运行时致命抱怨).这是怎么回事?