2009-06-04 39 views

Trả lời

25

Nếu bạn sử dụng

let s = Console.ReadLine 

bạn chỉ việc xây dựng một đại biểu trỏ đến hàm ReadLine. Bạn cần phải nói

let s = Console.ReadLine() 

để thực sự thực thi chức năng. Điều này giống như cú pháp C#, ngoại trừ kiểu suy luận có nghĩa là bạn không nhận được cảnh báo trình biên dịch.

+2

Yup. Console.ReadLine là một giá trị "đơn vị -> chuỗi". Bằng cách thêm dấu(), bạn đang truyền vào 'đơn vị' mà nó đang chờ đợi như một đối số. – YotaXP

+0

+1 - Hành vi này có thể được làm rõ hơn bằng cách yêu cầu một dấu cách phía trước(), giống như bất kỳ đối số nào khác cho hàm. –

+2

Bạn sẽ nhận được cảnh báo trình biên dịch! Khi bạn sử dụng ** s **. Có vẻ như bạn muốn viết 'Console.ReadLine() |> ignore'. Tôi cho rằng đó là C# không kiểm tra xem đầu ra của một hàm có bị bắt hoặc bỏ qua hay không. –

8

Ý của bạn là gì bởi "nó không được vinh danh"? Dưới đây là một ứng dụng giao diện điều khiển nhỏ Tôi vừa viết bằng VS2010b1, và nó hoạt động tốt:

open System 

let line = Console.ReadLine() 
Console.WriteLine("You wrote {0}", line) 

// Just to make it pause 
let unused = Console.ReadLine() 

Bạn đang cố gắng để chạy mã từ F # Interactive trong Visual Studio? Nếu vậy, đó có thể là vấn đề, như bài viết của Brian giải thích.

Tuy nhiên, tôi chưa thấy cùng vấn đề khi sử dụng F # Interactive từ dòng lệnh. Dưới đây là bảng điểm hoàn chỉnh của phiên:

Microsoft F# Interactive, (c) Microsoft Corporation, All Rights Reserved 
F# Version 1.9.6.16, compiling for .NET Framework Version v4.0.20506 

Please send bug reports to [email protected] 
For help type #help;; 

> open System;; 
> let line = Console.ReadLine();; 
Hello world 

val line : string = "Hello world" 

Chạy mã lặp của Brian từ F # Interactive không hiển thị cùng một vấn đề.

Dòng dưới cùng: Dường như điều này bị hỏng trong F # Interactive trong Visual Studio, nhưng không phải khi chạy tương tác từ dòng lệnh hoặc trong ứng dụng giao diện điều khiển đầy đủ.

+0

Tôi không sử dụng nó ở chế độ tương tác. Tôi chỉ đang xây dựng các ứng dụng giao diện điều khiển nhỏ. –

+0

Hmmm ... thật kỳ quặc. Đây có phải là phiên bản được cài đặt với VS2010b1 không? –

+0

Lạ. Hôm qua tôi không thể làm cho nó hoạt động bất kể tôi đã thử làm gì. Bây giờ tôi không thể làm cho nó thất bại, một lần nữa không có vấn đề gì tôi cố gắng. –

3

Tôi không có hộp Beta1 tiện dụng, nhưng tôi biết rằng trước đây chúng tôi đã có lỗi trong đó ReadLine() sẽ thấy các lệnh nền giao tiếp giữa giao diện người dùng tương tác và quá trình nền chạy F # của bạn mã. Có thể điều tra thú vị những gì

let Foo max = 
    let rec Loop i = 
     if i < max then 
      let line = System.Console.ReadLine() 
      printfn "line = %s" line 
      Loop (i+1) 
    Loop 1 

Foo 12 

in khi bạn tô sáng nó và 'Gửi tới tương tác'. Tôi nghĩ có thể bạn sẽ thấy một vài dòng thú vị không mong đợi, tiếp theo là các dòng bạn nhập vào cửa sổ.

+1

Yup, có vẻ như nó có thể là vấn đề: khi tôi thử điều đó trong bản beta 1, dòng đầu tiên được viết ra chỉ là "line =" –

+0

Sự khác biệt là bạn đang đặt khoảng trống trống vào cuối cuộc gọi ReadLine và tôi không phải vậy. –

Các vấn đề liên quan