هاسكل: نوع الاستدلال وتكوين وظيفة
-
20-09-2019 - |
سؤال
واستلهم هذا السؤال من طرف هذا <وأ href = "https://stackoverflow.com/questions/1334488/how-do-i-remove-every-occurance-of-a-value-from-a-list- في هاسكل باستخدام-تمهيدا / 1335530 # 1335530 "> الجواب لسؤال آخر، مشيرا إلى أنه يمكنك إزالة كل تواجد عنصر من القائمة باستخدام وظيفة محددة على النحو التالي:
removeall = filter . (/=)
والعمل بها مع القلم والورق من أنواع filter
، (/=)
و(.)
، وظيفة لديها نوع من
removeall :: (Eq a) => a -> [a] -> [a]
والذي هو بالضبط ما كنت تتوقع بناء على العقد الذي أبرمته. ومع ذلك، مع GHCi 6.6، وأحصل
gchi> :t removeall
removeall :: Integer -> [Integer] -> [Integer]
ما لم أحدد نوع صراحة (في هذه الحالة أنه يعمل بشكل جيد). لماذا هاسكل استنتاج مثل نوع معين من أجل وظيفة؟
المحلول
وماذا هاسكل استنتاج مثل نوع معين من أجل وظيفة؟
اقتباس فقرة>وGHCi تستخدم href="http://www.haskell.org/ghc/docs/latest/html/users_guide/interactive-evaluation.html#extended-default-rules" تعثر ، للاستدلال على أكثر من نوع خاص من مجموعة من الحالات الممكنة. يمكنك تجنب ذلك بسهولة عن طريق تعطيل تقييد أحاد الشكل ،
Prelude> :set -XNoMonomorphismRestriction
Prelude> let removeall = filter . (/=)
Prelude> :t removeall
removeall :: (Eq a) => a -> [a] -> [a]
نصائح أخرى
ومن الجدير بالذكر أيضا أنه إذا لم يتم تعيين اسم إلى التعبير، typechecker يبدو لتجنب التخلف نوع:
Prelude> :t filter . (/=)
filter . (/=) :: (Eq a) => a -> [a] -> [a]