takeWhile(或)dropWhile
将谓词作为参数。 |Int x->Bool|
问的第一个参数takeWhile
是什么? pipe
符号在haskell中的含义是什么?
foo := [1, 2, 3, 4, 5]
bar := foo.takeWhile |Int x->Bool| { return x < 3 }
// bar == [1, 2]
baz := foo.dropWhile |Int x->Bool| { return x < 3 }
// baz == [3, 4, 5]
答案 0 :(得分:3)
直接翻译成Haskell看起来像这样:
module SO where
foo :: [Int]
foo = [1,2,3,4,5]
bar :: [Int]
bar = takeWhile (\x -> x < 3) foo
baz :: [Int]
baz = dropWhile (\x -> x < 3) foo
这是GHCi中的示例输出:
λ> foo
[1,2,3,4,5]
λ> bar
[1,2]
λ> baz
[3,4,5]
我猜|Int x -> Bool| { return x < 3 }
是Fantom中lambda的语法 - 因此将谓词转换为Haskell只是
\x -> x < 3
正如您所看到的,Haskell不需要类型注释(管道 |
之间的部分) - 它可以推断它。
确实你根本不需要这些类型 - 但通常你会给它们模块中的顶级构造。
确实,虽然这只是Int
列表,但Haskell可以使相同的代码适用于所有类型的数字。
当你在谓词中使用数字文字(3
)和二元运算符<
时,你需要两个约束:
Num
了解您正在使用的号码Ord
代表<
GHCi会告诉你:
λ> :t (\x -> x < 3)
(\x -> x < 3) :: (Ord a, Num a) => a -> Bool
这就是为什么你也可以写更多的一般原因:
foo :: Num a => [a]
foo = [1,2,3,4,5]
bar :: (Num a, Ord a) => [a]
bar = takeWhile (\x -> x < 3) foo
baz :: (Num a, Ord a) => [a]
baz = dropWhile (\x -> x < 3) foo
也