F#类型声明可能是ala Haskell?

F#类型声明可能是ala Haskell?,haskell,f#,Haskell,F#,我查阅了许多资料来源:似乎不可能在F#ala Haskell中声明类型定义: ' haskell type def: myFunc :: int -> int 我想在F#中使用这种类型的def样式——FSI很乐意回应我: fsi> let myType x = x +1;; val myType : int -> int 我想明确说明F#中的类型def签名,就像Haskell中一样。有办法做到这一点吗?我想用F写: 您可以在F#like so中这样做,以指定myType的

我查阅了许多资料来源:似乎不可能在F#ala Haskell中声明类型定义:

' haskell type def:
myFunc :: int -> int
我想在F#中使用这种类型的def样式——FSI很乐意回应我:

fsi> let myType x = x +1;;

val myType : int -> int
我想明确说明F#中的类型def签名,就像Haskell中一样。有办法做到这一点吗?我想用F写:

您可以在F#like so中这样做,以指定myType的返回值

let myType x : int = x + 1
也可以指定参数的类型

let myType (x : int) : int = x + 1

希望这有帮助

通常的方法是执行
让myFunc(x:int):int=x+1


如果希望更接近haskell样式,还可以使用
let myFunc:int->int=fun x->x+1

如果希望将可读类型声明与实现分开,可以使用“fsi”文件(F#签名文件)。“fsi”只包含类型,通常还包含注释——您可以在F#库的源代码中看到一些很好的示例。您将创建如下两个文件:

// Test.fsi
val myFunc : int -> int

// Test.fs
let myFunx x = x + 1
这适用于已编译的项目,但在F#Interactive中无法轻松使用此方法。

另请参见(在“类型注释”下讨论了这一方面)。

另一个选项是使用“类型缩写”()


可以,通过使用lambda函数

myFunc : int -> int =
  fun x -> x*2

这也避免了haskell中两次写入函数名的问题。

我发现haskell Type def样式(和.fsi方式)是在F#中“绘制”的有用方式。你知道为什么FSI不支持这一点吗?为什么你不能直接做这些SIG?这更符合OCaml的传统吗?@Kevin:我不太确定,但我同意Haskell方法看起来比混合标题/类型注释更具可读性。这可能是OCaml的传统,因为我认为这不存在任何技术问题。将它们写进内联将是有意义的。。。(另一个问题是,这是否值得F#团队目前有限的资源)多亏了托马斯。为了记录在案,F队,漂亮吗?在线时间注释?我也想要它们,但很抱歉,这艘船已经驶过这里的语法,我们没有“附加”更改的计划。另请参见注意,.fsi是在.fs之后检查的,因此您可能仍然需要在.fs中添加一些类型注释,以使类型推断器满意。我知道您可以通过实际的函数定义以这种方式指定类型--这并不是我要问的。谢谢。@Kevin:请确保您理解类型注释和类型定义之间的区别。@Jon:有趣的位置。为什么大家都知道这是废话?在Haskell中,它是完全可选的,我个人觉得它非常有助于我勾勒出我希望我的类型如何排列。我对您所看到的类型def的问题很感兴趣。@Jon:type类不需要显式的类型签名或类型注释。包含类型类的Haskell 98是完全可推断的。多参数类型类的大多数标准用法也是如此。高阶多态性通常需要显式类型注释或签名,这被证明不是完全可推断的。有很多有用的功能,排名更高的类型,考虑为用户提供使用它们作为“类型系统的缺陷”的选项似乎是愚蠢的。“乔恩:我给出了一个正确的答案,你不正确的说法是Haskell中的类型注释无处不在,因为类型类无处不在。即使在不需要显式类型签名的情况下,也可以(除其他外)记录代码、强制使用以及改进错误消息的位置。@Jon:我从你的评论中注意到,你似乎对F#有着难以置信的防御能力。你的偏见是可以理解的,因为你想保护你的F#咨询公司和出版物,但毫无疑问,你拥有的智慧会更好地用来认识到F#肯定不是完美的,而且肯定会从Haskell那里拿走几页(这也不是完美的)。就函数式语言而言,这两种语言有很大的不同,它们都可以从另一种语言中使用的语言构造中获益。@Jon:当然,我的判断完全基于我在这里看到的关于堆栈溢出的几篇文章,更清楚的是,您似乎希望每种语言都是OCaml。诚然,我可能是错的,但是当像内联类型注释(以及类型类)这样简单、优雅、可选的东西由于模糊的原因被认为是“坏”的时候,它就会引起一些危险信号。另外,回复帖子中的一小部分内容并忽略其他内容也很方便,但我敢肯定,即使是你也认为这不是很有建设性。这是@sepp2k答案的重复。
type myType = int -> int
let (myFunc : myType) = (fun x -> x*2)
myFunc : int -> int =
  fun x -> x*2