كيفية تطبيق وظيفتين على نفس السلسلة دون استخدام ">>"

StackOverflow https://stackoverflow.com/questions/2540324

  •  23-09-2019
  •  | 
  •  

سؤال

أنا أكتب وظيفة مثل هذا.

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top