然而,我在这里寻找的是有用的片段,可重复使用的小"帮助"功能.或者模糊但又漂亮的模式,你永远不会记得.
就像是:
open System.IO
let rec visitor dir filter=
seq { yield! Directory.GetFiles(dir, filter)
for subdir in Directory.GetDirectories(dir) do
yield! visitor subdir filter}
Run Code Online (Sandbox Code Playgroud)
我想把它作为一个方便的参考页面.因此,没有正确的答案,但希望有很多好的答案.
EDIT Tomas Petricek专门为F#片段创建了一个网站http://fssnip.net/.
我需要一个具有某种逐步逻辑的函数,我想知道如何制作一个.我们以站点上的登录过程为例,所以我需要以下逻辑:
1)电子邮件存在?是的 - >继续; 否 - >返回错误
2)电子邮件至少有5个字符?是的 - >继续; 否 - >返回错误
3)密码存在?是的 - >继续; 否 - 返回错误
等等 ...
为了实现这一点,我通常会使用一个return语句,以便如果电子邮件不存在,我退出执行该函数并使其返回错误.但是我在Elixir找不到类似的东西,所以我需要一个建议.我现在能看到的唯一方法是使用嵌套条件,但也许有更好的方法?
在复杂函数中返回值时出现问题.示例总是更好:
考虑以下功能:
let myf (mypar: int) =
mypar + 1
Run Code Online (Sandbox Code Playgroud)
这里没有问题,这个函数编译正确,签名是:
val myf: int -> int
Run Code Online (Sandbox Code Playgroud)
好吧好吧.现在考虑这段代码:
let myf (mypar: int) =
if mypar = 2 then
4 (* ERROR *)
mypar + 1
Run Code Online (Sandbox Code Playgroud)
这不起作用:
这个表达式应该有类型单位,但这里有int
每当我尝试从我的函数返回时,当我在a if,whilea for或其他每个块中时,都会引发此错误.我认为问题是确保所有可能的返回路径返回相同的类型,但在这里我不明白会发生什么.
请注意,如果我插入一个()单元,一切都可以工作,例如:
let myf (mypar: int) =
if mypar = 2 then
() (* No error *)
mypar + 1
Run Code Online (Sandbox Code Playgroud)
但那个单位不会让我的功能恢复!它继续!!! 此外,你能解释一下F#如何处理这个???
谢谢