Можно использовать размещение новый конструктор, который берет адрес.
Foo* foo = new (your_memory_address_here) Foo ();
Смотрят на более подробное объяснение в C++ FAQ, облегченный или MSDN. Единственная вещь необходимо удостовериться, что память правильно выровненная (malloc
, как предполагается, возвращает память, которая является правильно выровненная для чего-либо, но остерегаются вещей как SSE, которому, возможно, понадобится выравнивание приблизительно к 16-байтовым границам).
myfunc ('t':'o':'a':'s':'t':'e':'r' : restOfString) = ...
Использование обычного сопоставления с образцом работает, но становится неудобным по мере того, как строка префикса становится длиннее.
{-# LANGUAGE PatternGuards #-}
import Data.List
myFunc string | Just restOfString <- stripPrefix "toaster" string =
-- do something special
myFunc string = -- do the default case here
Использование библиотечной функции вместо сопоставления с образцом немного легче читать и писать.
{-# LANGUAGE ViewPatterns #-}
import Data.List
myFunc (stripPrefix "toaster" -> Just restOfString) = -- do something special
myFunc string = -- do the default case here
] Расширение синтаксиса GHC 6.10 делает это использование еще более естественным.
Конечно, последние два полностью эквивалентны, и мы можем обойтись (беспорядочно) вообще без всякого сахара.
import Data.List
myFunc string =
if restIsJust
then -- do something special
else -- do the default case here
where
(restIsJust, restOfString) =
case stripPrefix "toaster" string of
Just something -> (True, something)
Nothing -> (False, undefined)
Эти расширения синтаксиса предназначены для создания а нам жизнь проще.
import Data.List
myFunc str | "toaster" `isPrefixOf` str = something restOfString
| otherwise = somethingElse
where Just restOfString = stripPrefix "toaster" str
Библиотека Split, http://hackage.haskell.org/packages/archive/split/0.1.1/doc/html/Data-List-Split.html имеет множество функций для разделения строк на строки, включая сопоставление префиксов. Вы можете найти там что-нибудь полезное.
myfunc ('t' : 'o' : 'a' : 's' : 't' : 'e' : 'r' : restOfString)
Насколько мне известно, нет более лаконичного синтаксиса, чем этот.
Вы, конечно, также можете просто проверить, начинается ли строка с тостер в предложении guard или if
внутри тела функции.
myFunc str =
case stripPrefix "toaster" str of
Just restOfString -> something restOfString
Nothing -> somethingElse
Вот почему stripPrefix возвращает тип Maybe.