我为自己设定了以下挑战(并且失败了):
我想编写一个map函数,map f lofls它接受一个函数,f 'a -> 'b和一个列表列表,lofls 'a list list并将这个函数应用于f列表列表的每个元素.我添加的约束是我不允许使用嵌套映射列表,我必须递归地执行它.
我尝试用F#来做,但任何语言都应该这样做.有任何想法吗?
这是我的尝试(虽然有效,但很难看,我也不喜欢使用rev ......)
let map f lis =
let rec map2 f lis aux =
match (lis, aux) with
|([], []) -> []
|([], aux) -> [aux]
|(hd::tl, aux) ->
match hd with
|[] -> (List.rev aux) :: (map2 f tl [])
|x::xs -> map2 f (xs::tl) ( (f x) :: aux )
map2 f lis []
Run Code Online (Sandbox Code Playgroud)
(我也意识到这已经以更简洁的形式发布了)
我注意到我无法在 OCaml 中执行以下操作:
# let foo (f : 'a -> unit) = f 1; f "s";;
Run Code Online (Sandbox Code Playgroud)
Error: This expression has type string but an expression was expected of type
int
Run Code Online (Sandbox Code Playgroud)
在 Haskell 中,可以通过使用 Rank2Types 普遍量化输入函数来解决这个问题f:
{-# LANGUAGE Rank2Types #-}
foo :: (forall a. a -> ()) -> ()
foo f = let a = f 1 in f "2"
Run Code Online (Sandbox Code Playgroud)
我如何在 OCaml 中获得类似的体验?