这是我已经达到的目标,我无法弄清楚如何在比较它们之前使用take 3
获取a和b中的前3个字符。
checkstring :: String -> String -> Bool
checkstring a b = if a == b then True
else False
答案 0 :(得分:4)
你可以把它写成:
import Data.Function(on)
checkstring :: Eq a => [a] -> [a] -> Bool
checkstring = on (==) (take 3)
这里我们使用on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
函数。此函数接受输入函数b -> b -> c
(此处为(==)
)和函数a -> b
(此处为take 3
)。
我们生成的函数有两个值(a
s)。它将第二个函数应用于这两个值,然后使用两个函数调用的结果调用第一个函数。
所以on
定义为:
on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
on f g x y = f (g x) (g y)
请注意,checkstring
函数比仅处理String
更通用:只要[a]
成立,它就可以处理任何类型的列表Eq a
。
我建议你将函数重命名为更好地描述它的功能。例如samefirst3
:
import Data.Function(on)
samefirst3 :: Eq a => [a] -> [a] -> Bool
samefirst3 = on (==) (take 3)
答案 1 :(得分:2)
这比我想象的要容易
checktring :: String -> String -> Bool
checkstring a b = if take 3 a == take 3 b then True
else False