【发布时间】:2013-02-11 20:45:03
【问题描述】:
我读过一本叫Clean code 的书。我从书中得到的最强烈的信息之一是代码必须可读。我不明白为什么 F# 等函数式语言不将函数参数名称包含在智能感知或类型定义中?
比较
val copy: string -> string -> unit
与
val copy: sourceFile:string -> destinationFile:string -> unit
函数式世界中的最佳实践是什么?我们应该更喜欢单参数函数吗?这就是Clean code 所提倡的。或者我们应该为 2+ 参数的所有函数使用 records 吗?
我知道一种解决方法是使用 static member 而不是 let 函数,但这不是一种函数式方法,是吗?
编辑:
只是为了提供更多信息:
当然还有其他人。它们只是不在类型定义中显示参数名称。
【问题讨论】:
-
您使用的是什么版本的语言?在 F# 3.0 中,在 F# interactive 中键入
let f x y = x + y + 1会得到:val f : x:int -> y:int -> int(而 IntelliSense 在编辑器中会得到相同的结果)。 -
这是对的,但是如何:让 g() = let f x y = x + y + 1 in ()。任何不在顶层的东西都不起作用。但很高兴知道 F# 团队试图对此做些什么;)我只是对函数式编程的一般性质感到困惑。或者其他函数式语言是否显示参数名称?
-
这是关于 IDE 和开发环境,而不是语言。
-
至少在 Haskell 中,模式匹配使得类型签名中的命名参数通常不切实际。
foo Nothing = bar; foo (Just []) = baz; foo (Just (x:xs)) = quux。 IDE 应该怎么做?另外,foldl' :: (a -> b -> a) -> a -> [b] -> a; foldl' f z = go z where go ...,定义中只明确提供了一些参数。 -
"我们更喜欢单参数函数吗?" 每个 函数只接受一个参数。
addThree :: Int -> Int -> Int -> Int是一个接受Int并返回的函数(一个接受Int并返回的函数(一个接受Int并返回Int的函数))。 [当然这很麻烦,所以人们通常说一个函数接受三个参数,但有时,区别很重要。]
标签: haskell f# functional-programming ocaml named-parameters