سؤال

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