كيفية تطبيق وظيفتين على نفس السلسلة دون استخدام ">>"
سؤال
أنا أكتب وظيفة مثل هذا.
func :: IO()
func = putStr print "func = putStr print"
أعلم أن هذا غير صحيح ولكن الفكرة هي أنني أريد ذلك putStr
تطبق على السلسلة بعد ذلك print
يتم تطبيقه على نفس السلسلة "fun = .."
بحيث يكون الناتج:
func = putStr print "func = putStr print"
وهو نفس تعريف وظيفتي.شكرًا
المحلول
إذا كان هدفك هو كتابة كواين (مثال آخر لهاسكل مذكور في هذه المقالة أيضًا)، يمكنك استخدام تدوين لامدا لالتقاط المتغيرات.
func = (\x -> putStr x >> print x) "func = (\\x -> putStr x >> print x) "
نصائح أخرى
لست متأكدًا إلى أين أنت ذاهب مع "بدون استخدام >>
"جزء (إذا كان هذا هو حقًا استخدام النقطة do
-لاوت) ، ولكن يمكنك بسهولة كتابة دالة المساعد التي تطبق وظيفتين بالتسلسل على نفس الإدخال:
tee f g s = f s >> g s
func = tee putStr print "..."
أيضا ، لتجنب تكرار السلسلة ، متغير محلي مع let
أو where
ربما يكون أسهل:
let s = "..."
in putStr s >> print s
يمكنك أن تفعل ذلك مثل هذا:
doActions str actions = mapM_ ($ str) actions
لا تنتمي إلى StackOverflow