2016-07-06 39 views
3

我試圖在f#中使用函數,但是現在我發現了一個問題。f# - 這個表達式預計有int類型,但是這裏有類型'a - > int

我創建了函數來在數組和文件txt中添加數字,但Visual Studio說我的代碼中有一個錯誤。

功能是:

let fnAddNodeFileAndArray (pstrnode:string) lintRowResult:int = 

//Declare variables 
let mutable lstrText = "" 
let mutable larrColisionsAux = Array2D.zeroCreate 0 0 
let mutable lintIndexOfSpace = 0 
let mutable lstrfirstNumber = "" 
let mutable lstrsecondNumber = "" 
let mutable lintNumberColisionNetwork = 0 
let mutable lblnCollisionExist = false 
let mutable lintRowResultAux=0 

//Identify the position where the separator 
lintIndexOfSpace<-pstrnode.IndexOf(",") 
//Get nodes of the collision 
lstrfirstNumber<-(pstrnode.Substring(0,lintIndexOfSpace)) 
lstrsecondNumber<-(pstrnode.Substring(lintIndexOfSpace + 1)) 

for lintRow = 0 to garrrows - 1 do 
    let mutable lintNumberAux1 = int garrColisions.[lintRow,0] 
    let mutable lintNumberAux2 = int garrColisions.[lintRow,1]  
    if (string lstrfirstNumber = string lintNumberAux1 && string lstrsecondNumber = string lintNumberAux2) || 
     (string lstrfirstNumber = string lintNumberAux1 && string lstrsecondNumber = string lintNumberAux2) then 
     lblnCollisionExist <- true 

if lblnCollisionExist=true then 
    printfn "" 
    printfn "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" 
    printfn "Node already exist." 
    printfn "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" 
    lintRowResultAux 
else  

    //Copy the values of the array to auxiliar array 
    larrColisionsAux<-garrColisions 

    //Update de number of collisions 
    garrrows <- garrrows + 1 

    //Re-Create array 
    garrColisions <- Array2D.zeroCreate garrrows 3 

    for lintRow = 0 to garrrows - 2 do 
     garrColisions.[lintRow,0] <- larrColisionsAux.[lintRow,0] 
     garrColisions.[lintRow,1] <- larrColisionsAux.[lintRow,1] 
     garrColisions.[lintRow,2] <- larrColisionsAux.[lintRow,2] 

    //Save the new Number in auxiliar Array 
    garrColisions.[(garrrows-1),0] <- string lstrfirstNumber 
    garrColisions.[(garrrows-1),1] <- string lstrsecondNumber 

    //Save the number in the file 
    for lintCount = 0 to garrrows-1 do 
     lstrText <- lstrText + garrColisions.[lintCount,0] + " " + garrColisions.[lintCount,1] + "\n" 
    File.WriteAllText(gstrpath,lstrText) 

    for lintRow = 0 to (garrrows - 2) do  
     let mutable lintNumberAux1 = int garrColisions.[lintRow,0] 
     let mutable lintNumberAux2 = int garrColisions.[lintRow,1]  
     let mutable lintNumberCollisionNetworkAux = int garrColisions.[lintRow,2] 
     let mutable lblnLessOneNumberOfTheCollisionNetwork = false 

     if (lstrfirstNumber <> string lintNumberAux1) && 
      (lstrsecondNumber <> string lintNumberAux2) && 
      (lstrfirstNumber <> string lintNumberAux2) && 
      (lstrsecondNumber <> string lintNumberAux1) then 
      if lintNumberColisionNetwork = 0 then 
       gintNumberColisionNetwork <- gintNumberColisionNetwork + 1 
       garrColisions.[(garrrows-1),2] <- string (gintNumberColisionNetwork) 
     elif ((lstrfirstNumber = string lintNumberAux1) && (lstrsecondNumber <> string lintNumberAux2)) || 
       ((lstrfirstNumber <> string lintNumberAux1) && (lstrsecondNumber = string lintNumberAux2)) || 
       ((lstrfirstNumber <> string lintNumberAux2) && (lstrsecondNumber = string lintNumberAux1)) || 
       ((lstrfirstNumber = string lintNumberAux2) && (lstrsecondNumber <> string lintNumberAux1)) then 
      if lintNumberColisionNetwork < lintNumberCollisionNetworkAux then 
       garrColisions.[(garrrows-1),2] <- garrColisions.[lintRow,2] 
       if lintNumberColisionNetwork <> 0 && lblnLessOneNumberOfTheCollisionNetwork = false then 
        gintNumberColisionNetwork <- gintNumberColisionNetwork - 1 
        lblnLessOneNumberOfTheCollisionNetwork <- true 
       lintNumberColisionNetwork <- int garrColisions.[lintRow,2] 
      elif lintNumberColisionNetwork > lintNumberCollisionNetworkAux then 
       garrColisions.[lintRow,2] <- garrColisions.[(garrrows-1),2] 
       if lintNumberColisionNetwork <> 0 && lblnLessOneNumberOfTheCollisionNetwork = false then 
        gintNumberColisionNetwork <- gintNumberColisionNetwork - 1 
        lblnLessOneNumberOfTheCollisionNetwork <- true 
       lintNumberColisionNetwork <- int garrColisions.[lintRow,2] 
    garrrows 

let fnAddnode() = 

    let mutable lintrow = 0 
    let mutable lstrNode = "" 

    lstrNode <- fnGetNewNode() 
    lintrow <- fnAddNodeFileAndArray(lstrNode) 
    fnPrintCollisionOneNode (lintrow) 

當我嘗試調用的函數,系統顯示該messagem:

這種表達預計將有一個int類型,但這裏的類型爲「A - > int

有人知道這是什麼意思?

+1

通常,當您有類似'預計有類型的錯誤,但此處有類型'這意味着您沒有將參數傳遞給函數。 –

+4

如果你正在學習F#和函數式編程,你應該避免使用'mutable'。我知道起初很難,但是你應該在開始時避免它,因爲它只會減慢你的學習速度,並且它不被認爲是功能性的。我使用mutable的唯一時間是當我使用[P/Invoke](https://msdn.microsoft.com/en-us/library/hh304361(v = vs.100).aspx) –

+0

有許多重複項:例如[This expression](http://stackoverflow.com/questions/34321963/this-expression-was-expected-to-have-type-string-int-but-here-has-type-in​​t?s=2|3.7914 )這意味着某些東西應該是一個數字,而不是一個函數。 – s952163

回答

1

如果你將鼠標懸停在let fnAddNodeFileAndArray (pstrnode:string) lintRowResult:int =你會發現,類型簽名如下:

VAL fnAddNodeFileAndArray:pstrnode:字符串 - > lintRowResult:'A - > INT

這意味着函數接受字符串,返回一個採用lintRowResult的函數,然後返回一個int。因爲你沒有在lintRowResult中放置paranthesis,所以F#認爲你註解了函數的返回類型,而不是參數的輸入類型。也許你想說的話是這樣的:

let fnAddNodeFileAndArray (pstrnode:string) (lintRowResult:int) =

這個函數的類型簽名不是會變成:

VAL fnAddNodeFileAndArray:pstrnode:字符串 - > lintRowResult:INT - > INT

這是一個函數,它接受一個字符串和一個int,然後返回一個int。所以它有兩個參數。現在,如果您轉到代碼中的倒數第二行:lintrow <- fnAddNodeFileAndArray(lstrNode)您只有一個參數。所以,很可能你就需要寫類似: lintrow <- fnAddNodeFileAndArray lstrNode lintRow

現在很明顯你fnAddNodeFileAndArray功能可能是隻需要一個lstNode的功能,在這種情況下離開關lintRowResult輸入參數:
fnAddNodeFileAndArray (pstrnode:string)

val fnAddNodeFileAndArray:pstrnode:string - > int

您可以看到F#知道該函數的輸出類型。

您應該認真對待@ GuyCoder的評論,關於在任何地方定義mutable。代碼讀取非常必要,像通過谷歌翻譯蟒蛇...你也許發佈它在CodeReview它也相當長,包含外部引用和其他錯誤。通過一個較小的自包含示例,您將擁有更好的運氣,請參閱:MCVE

相關問題