Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用zipWithIndex的Scala代码的F版本_Scala_F# - Fatal编程技术网

使用zipWithIndex的Scala代码的F版本

使用zipWithIndex的Scala代码的F版本,scala,f#,Scala,F#,这段Scala代码(我稍微简化了一些,所以我可能犯了一个错误)将一系列以换行符分隔的输入行转换为这些行中非空格字符的坐标列表。下面是我将其转换为F#的失败尝试 第一个坐标是行内字符的索引,第二个坐标是字符串内行的坐标 F#似乎没有zipWithIndex的等价物(尽管它有一个提供索引的映射重载),序列表达式的语法与Scala的生成器表达式的语法非常不同,我正在努力编写F#等价物 Scala代码: val input = "X \n X" def charCoors(input: String)

这段Scala代码(我稍微简化了一些,所以我可能犯了一个错误)将一系列以换行符分隔的输入行转换为这些行中非空格字符的坐标列表。下面是我将其转换为F#的失败尝试

第一个坐标是行内字符的索引,第二个坐标是字符串内行的坐标

F#似乎没有zipWithIndex的等价物(尽管它有一个提供索引的映射重载),序列表达式的语法与Scala的生成器表达式的语法非常不同,我正在努力编写F#等价物

Scala代码:

val input = "X \n X"

def charCoors(input: String) = for {
    (xs, y) <- input.split('\n').map(_.zipWithIndex).zipWithIndex.iterator
    (c, x) <- xs.iterator
    if c != ' '
  } yield Coord(x, y)

我想您几乎已经拥有了它-您只需对行使用
List.mapi
Seq.mapi
(因为字符串是
IEnumerable
而不是List):

让charCoords输入=
让线=分割线输入
序号{
对于List.mapi(fun y line->(y,line))中的(y,line)行
对于Seq.mapi中的(x,字符)(有趣的x字符->(x,字符))
行吗
如果为字符“”,则产生(x,y)
}
请注意,这将编译并运行,但我不知道id是否符合您的要求:

> charCoords input;;

val it : seq<int * int> = seq [(0, 0); (1, 1)]
>字符输入;;
valit:seq=seq[(0,0);(1,1)]

谢谢!我很困惑,因为我得到的错误是“这个表达式应该有类型'a->string*'a,但这里有类型'b*'c”,参考“for(y,line)”——而类型推断错误让我认为我的方法可能在某个地方完全错了!那一个来自
.map
vs
.mapi
let charCoords input =
    let lines = splitLines input
    seq {
        for (y, line) in List.mapi (fun y line -> (y, line)) lines do
        for (x, character) in Seq.mapi (fun x character -> (x, character)) 
                                       line do
        if character <> ' ' then yield (x, y)
    }
> charCoords input;;

val it : seq<int * int> = seq [(0, 0); (1, 1)]