2016-10-09 16 views
2

F#でモジュールを作成しようとしていますが、3番目の要素がリストから削除され、その要素がない新しいリストが返されます。私は今、私はエラーが供給していますので、これまでリストからすべての3番目の要素を削除するF#

module Program1 = 
open System 
let remove list1= 
    let collectList = List.iteri (fun i x -> if i%3 <> 0 then x) list1 
    collectList 
[<EntryPoint>] 
let main argv = 
let list = [ 1; 2; 3] 
printfn "new List is %A" (Program1.remove list) 
0 

を試してみましたが、私は解決するために、すべての日を試みた何この出力

List with elements eliminated: [1; 2; 4; 5; 7; 8; 10; 11; 13; 14] 

を与えるsould例

let input = [ 1 .. 15 ] 

printfn "List with elements eliminated: %A" (Program1.remove input) 

ため

それ。 は、このエラーのために事前

+2

を発見したように、より良いアプローチは、あなたがどのようなエラーメッセージを受け取ったのかもしれませんか? –

+0

ここで再帰的なアプローチのヒント:http://stackoverflow.com/questions/18906178/delete-third-element-in-f-list/18906483#18906483 –

答えて

1

にありがとう:

error FS0001: Type mismatch. Expecting a 
    'unit list' 
but given a 
    'int list' 
The type 'unit' does not match the type 'int' 

問題はラインif i%3 <> 0 then xから来ています。 else節を持たないif式です。タイプはunitでなければなりません。タイプ推論の結果は、のxになります。 F#条件式の詳細については、https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/conditional-expressions-if-then-elseを参照してください。

編集List.iteriunitを返すので、List.iteriはあなたの意図したことをしません。問題を解決するには、List.mapList.filterList.chooseList.foldBackなどの関数が必要です。

(あなたは軽微な変更を加える必要があります)この問題にアプローチする方法についてのアイデアを得るために、この記事から受け入れ答えを読む:Getting every nth Element of a Sequence

リストを結果に構築するためにList.foldBackを使用して簡単な方法もあります。

+0

'List.iteri' 'unit 'も返す。また、リンクされた答えは正しいが、簡単なアプローチは 'List.foldBack'を使って簡単に行うことができる。 – Sehnsucht

+0

' let list = [1..15] ' ' let r1 = List.filter(fun x - > X%3 <> 0) list' 'printfnこれは私の最終的な解決策だった r1' "新しいリスト%のAです"。ヒントをありがとう。私の問題は、すべてのタイプのリストのすべてのtrird要素を削除しようとしていたということでしたが、私の場合は、常にList.filterを使って簡単に行うことができるように昇順のリストを持ちます。 ありがとう –

0

私はあなたが一つの機能的なアプローチよりも、その最初のケースは、この

//safe take and skip fn (no exceptions) 
let take x xs = if List.length xs >= x then List.take x xs else [] 
let skip x xs = if List.length xs >= x then List.skip x xs else [] 
let rec remove x xs = 
    //effectively this drops every xnt element 
    let head = take (x - 1) xs 
    let tail = skip x xs 
    match tail with 
    | [] -> head 
    | _ -> List.append head (remove x tail) 

let x = ["One";"Two";"Three";"Four";"Five";"Six";"Seven";"Eight";"Nine";"Ten"] 
remove 3 x 

ようなことができれば3

により、すべての3番目の値またはすべての値のdivideableをフィルタ処理しようとする場合は、これがわかりませんかなり重い重量;-)
あなたはほとんど

let x = ["One";"Two";"Three";"Four";"Five";"Six";"Seven";"Eight";"Nine";"Ten"] 
let indices = [1 .. List.length x] 

List.zip indices x 
|> List.filter (fun (x,_) -> x % 3 <> 0) 
+1

最後にF#4以降のアイテムのみを取得することを忘れないでください。0 List.indexed> List.filter(fun(i、_) - > i%3 <> 0 List.indexedはList.indexedを返します。 )|> List.map snd' – Sehnsucht

+0

@Sehnsucht yeah thatsさらに良い – robkuz

関連する問題