我正在与几行可悲的代码作斗争,但无法解决这个问题——无论出于何种原因,我都无法理解 F# 类型系统这一方面的原则,到目前为止,我的所有阅读都没有奏效。
谁能向我指出我在这里犯的相当愚蠢的小学生错误?我知道我在做一个,我只是看不到它!我正在努力摆脱痛苦的初学者领域,因此了解为什么这不起作用的全部原则是我的目标 - 任何帮助都将不胜感激!
这是一个简单的练习——实际上只是一个练习,实际上并不需要一个 monad 来执行,但是我真的希望这些东西能在我的下一个项目中使用。
let stringToInt str = Int32.TryParse(str)
type wk() =
member this.Bind(f , str) = f str
member this.Return(f ) = f
let strInt = new wk()
let test a = strInt{let! b = strInt.Bind a stringToInt
return b}
let x = test "10"
printfn "%s" x
我得到以下信息:
Program.fs(117,14): error FS0001: This expression was expected to have type
(string -> bool * int) -> ('a -> 'a) -> 'b
but here has type string
更新:根据下面的帮助,我现在有这个工作:
open System
open System.Threading
let stringToInt str = snd <| Int32.TryParse(str)
type wk() =
member this.Bind(funct, str) = funct str
member this.Return(str) = str
let strInt = new wk()
//Jack P syntax!
let test2 str funct = strInt{
let! b = funct str
return b
}
let go2 = test2 ("10", stringToInt) |> printfn "%A"
尽管在概念上可能还没有工作——获得打印的价值并没有发生。我会继续破解 - 我已经阅读了大量的书籍,这就是我从中得到练习的地方,但我想得到这个概念的唯一方法是继续与之抗争。
我在我的博客上以更简单的形式成功:http ://richardgriffiths.azurewebsites.net/?p=2332 所以我只需要打破类型系统的语法/概念障碍。